2017-12-10 22 views
0

Die folgenden demo Drucke 21 anstelle von 12. Warum?Funktioniert Variadic Template-Funktion Lambda-Parameter in umgekehrter Reihenfolge?

#include <iostream> 
template<class... F> void callMany(F... fib){ 
    [&](...){}(
     (fib(),123)... 
    ); 
} 
int main() 
{ 
    auto f1=[&](){std::cout<<"1";}; 
    auto f2=[&](){std::cout<<"2";}; 
    callMany(f1,f2); 
} 

Ich habe es mit vC++ und g ++ getestet. Beide Ergebnisse sind gleich.

Ist es ein Standardverhalten? Wenn ja, welche Regeln und warum?
Kommt es auf den Compiler an?

Es gibt a way um es umzukehren, aber ich denke, es ist ein bisschen unabhängig.

Antwort

3

Wenn ein Ausdruck ausgewertet wird, der eine Paketerweiterung enthält, wird zuerst das Paket erweitert --- das den Code sozusagen instanziiert, ohne eine Auswertung durchzuführen ---, dann wird der resultierende Ausdruck wie üblich ausgewertet Regeln. Ihr Ausdruck

[&](...){}(
    (fib(),123)... 
); 

in

erweitert
[&](...){}(
    (f1(),123), (f2(),123) 
); 

und da Funktionsargumente in einem nicht näher ausgewertet werden, können Sie nicht darauf verlassen, f2 vor f1 oder umgekehrt aufgerufen wird.

+0

@cppBeginner Ja, gibt es, aber ich kann es nicht in einem Kommentar erklären. Sie sollten eine neue Frage stellen. – Brian

Verwandte Themen