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?
¿Qué significa "lo que solíamos llamar puntos de secuencia"? –
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