una recorrer listas lista insertar ingresar estructura estatica eliminar elementos elemento datos como codigo c++ gcc c++11 initializer-list order-of-evaluation

recorrer - listas estructura de datos c++



Orden de evaluaciĆ³n de elementos en lista-inicializaciĆ³n. (1)

Respondiendo a mi propia pregunta. Eliminar la pregunta no sería una buena idea, ya que alguien podría tener la misma pregunta en el futuro.

Sí. Es un error en el compilador GCC.

tomado del comentario de @Johannes Schaub a la pregunta.

En el otro tema , @Dietmar dio esta solución:

template <typename... T> std::tuple<T...> parse(std::istream& in) { return std::tuple<T...>{ T(in)... }; }

declarando que,

El uso de la inicialización de llaves funciona porque el orden de evaluación de los argumentos en una lista de inicializadores de llaves es el orden en que aparecen . (enfatiza el mio)

El texto relevante del Estándar C ++ (n3485) es,

Dentro de la lista inicializadora de una lista iniciada con arriostramiento, las cláusulas inicializadoras, incluidas las que resulten de expansiones de paquetes (14.5.3), se evalúan en el orden en que aparecen. Es decir, cada cálculo de valor y efecto secundario asociado con una cláusula de inicialización determinada se secuencia antes de cada cálculo de valor y efecto secundario asociado con cualquier cláusula de inicializador que sigue en la lista separada por comas de la lista de inicializador. [Nota: Este orden de evaluación se mantiene independientemente de la semántica de la inicialización; por ejemplo, se aplica cuando los elementos de la lista de inicializadores se interpretan como argumentos de una llamada de constructor, aunque normalmente no hay restricciones de secuencia en los argumentos de una llamada. "Nota final"

Así que traté de probar esto con el siguiente código:

template<int N> struct A { std::string data; A(std::istream & stream) { stream >> data; } friend std::ostream& operator<<(std::ostream & out, A<N> const & a) { return out << "A"<<N<<"::data = " << a.data; } }; typedef A<1> A1; typedef A<2> A2; template<typename ...Args> void test(std::istream & stream) { std::tuple<Args...> args { Args(stream)... }; std::cout << std::get<0>(args) << std::endl; std::cout << std::get<1>(args) << std::endl; } int main() { std::stringstream ss("A1 A2"); test<A1,A2>(ss); }

Rendimiento esperado:

A1::data = A1 A2::data = A2

Salida real:

A1::data = A2 A2::data = A1

¿Hice algo mal en mi código de prueba? Cambié mi código a esto:

std::stringstream ss("A1 A2"); std::tuple<A1,A2> args{A1(ss), A2(ss)}; std::cout << std::get<0>(args) << std::endl; std::cout << std::get<1>(args) << std::endl

La misma salida que antes. MinGW (GCC) 4.7.0 mi código con MinGW (GCC) 4.7.0 y 4.7.2 . Incluso ideone da esta salida .

¿Es un error en el compilador?