簡體   English   中英

折疊表達式的評估順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM