5

Para este ejemplo no variadic:Secuenciación entre una expansión variadic

int  Func1(); 
double Func2(); 
void MyFunc(int, double); 

int main() 
{ 
    MyFunc(Func1(), Func2()); 
    //... 
} 

no se especifica si Func1() o Func2() se calcula en primer lugar, sólo que ambos deben hacerse antes MyFunc() se llama.

¿Cómo funciona esta secuencia con la expansión de argumentos variados?

template < typename Func, typename ...Args > 
void MyFunc2(Func &&f, Args&& ...a) 
{ 
    int b[] = { f(std::forward<Args>(a))... }; 
    //... 
} 

Digamos que f es un objeto de función que cambia de estado después de su primera llamada. ¿Se llamará f para cada segmento de a? En otras palabras, ¿se llamará al f en el primer elemento de la lista a, luego al segundo elemento, el tercero, etc., en lugar de omitir aleatoriamente la lista expandida? ¿Hay lo que solíamos llamar puntos de secuencia entre cada elemento?

+0

¿Qué significa "lo que solíamos llamar puntos de secuencia"? –

+0

Solo sé un poco al respecto, pero las afirmaciones como "hay un punto de secuencia entre * x * y * y *" se han reemplazado por "* x * se secuencia antes de * y *." La nueva definición completa es más precisa e incluye adaptaciones para enhebrar. – CTMacUser

Respuesta

5

Sí, las listas de inicializadores incluidos garantizan una orden de evaluación de izquierda a derecha, mientras que las llamadas a función no. Entonces MyFunc2 se secuenciará correctamente.

El artículo de Wikipedia cubre lo siguiente: https://en.wikipedia.org/wiki/Variadic_templates

¿Existe lo que solíamos llamar puntos de secuencia entre cada artículo?

No, si bien utiliza una coma token de que no es el operador coma.

+0

Interesante. Sin embargo, el ejemplo con 'pass' no funciona con GCC-4.7. Las expresiones en 'pass {std :: cout << args ...}' se ejecutan de derecha a izquierda en mi máquina. ¿Es esto un error en GCC-4.7? ¿O es incorrecta la descripción en Wikipedia? – nosid

+0

@nosid Creo recordar haber oído que GCC tenía ese error. Litb escribió ese segmento de artículo y nunca se equivoca (jeje, se lo preguntaré la próxima vez que se conecte) – Pubby

+0

Tienes razón. Lo he encontrado en §8.5.4.4 (borrador n3290): "[..] Las cláusulas del inicializador [..] se evalúan en el orden en que aparecen". y "Este orden de evaluación tiene [...] - aunque normalmente no hay restricciones de secuencia en los argumentos de una llamada". – nosid