2017-12-10 33 views
0

아래 demo12 대신 21을 인쇄합니다. 왜?가변 템플릿 함수는 람다 매개 변수를 역순으로 호출합니까?

#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); 
} 

vC++ 및 g ++로 테스트했습니다. 두 결과 모두 같습니다.

표준적인 동작입니까? 그렇다면 어떤 규칙이 적용되며 그 이유는 무엇입니까?
컴파일러에 의존합니까?

역순으로는 a way이 있지만, 조금 비협조적이라고 생각합니다.

답변

3

팩 확장을 포함하는 표현식을 평가하면 팩이 먼저 펼쳐집니다. 즉, 평가를 수행하지 않고 간단히 코드를 인스턴스화하여 결과 표현식이 평소대로 평가됩니다 규칙. 귀하의 표현

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

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

으로 확장되고, 함수 인수가 지정되지 않은 순서대로 평가되기 때문에, 당신은 f1 또는 반대하기 전에 호출되는 f2에 의존 할 수 없다.

+0

@cppBeginner 예, 설명이 있지만 설명에서 설명 할 수 없습니다. 새로운 질문을 올리십시오. – Brian