[英]Initializer list, parameter pack expansion, fold expressions and order of evaluation
[英]Order of Evaluation for Fold Expressions
折疊表達式似乎是將函數應用於元組的每個元素的好方法。 但是,如果應用的函數具有副作用,則函數調用的順序可能是一個重要的問題。
考慮:
#include <iostream>
template<typename... Ts>
void printStuff(Ts... args)
{
( ([](auto&& v) { std::cout << v << " "; })(args), ... );
std::cout << '\n';
}
int main()
{
printStuff("hello", 42, 1.5f);
// expected output: hello 42 1.5
}
這似乎有效 。
但是這里保證lambda的評估順序還是最終可能會在輸出中翻轉這些值? 如果我使用不同的運算符將命令鏈接在一起,答案是否會改變?
對運算符的右... (arg0 op (arg1 op arg2))
展開如下: ... (arg0 op (arg1 op arg2))
。 因此,雖然parens幫助,但他們不保證個別元素的順序。
因此,這一切都留給了op
。 逗號運算符 (與逗號分隔函數參數不同),即使是前C ++ 17,也是一個硬序列點。 它確保從左到右的評估,沒有串擾。
如果您使用+
,則沒有排序保證。 所以這取決於您使用的操作員。 C ++ 17增加了一些具有嚴格排序保證的運算符(例如<<
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.