[英]Iterate in reverse order through the parameter-pack of a variadic template function
[英]Does variadic template function call lambda parameter in reverse order?
下面的演示打印21
而不是12
。 為什么?
#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 ++對其進行了測試。 兩者的結果是相同的。
這是標准行為嗎? 如果是這樣,有哪些規則,為什么?
它取決於編譯器嗎?
有一種方法可以逆轉它,但我認為這有點無關。
當評估包含包擴展的表達式時,首先擴展包-可以簡單地實例化代碼,可以說,無需執行任何評估-即可根據通常的規則對結果表達式進行評估。 你的表情
[&](...){}(
(fib(),123)...
);
擴展為
[&](...){}(
(f1(),123), (f2(),123)
);
並且由於函數參數是按未指定的順序求值的,因此您不能依賴於在f1
之前調用f2
, 反之亦然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.