折叠表达式的评估顺序

时间:2017-09-05 13:30:49

标签: c++ c++17 fold-expression

折叠表达式似乎是将函数应用于元组的每个元素的好方法。但是,如果应用的函数有副作用,函数调用的顺序可能是一个重要的问题。

考虑:

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

seems to work

但是这里保证lambda的评估顺序还是最终可能会在输出中翻转这些值?如果我使用不同的运算符将命令链接在一起,答案是否会改变?

1 个答案:

答案 0 :(得分:9)

对运算符的右侧展开式扩展如下:... (arg0 op (arg1 op arg2))。因此,虽然parens帮助,但他们不保证个别元素的顺序。

因此,所有这一切都由op决定。 comma operator(与逗号分隔函数参数不同),即使是前C ++ 17,也是一个硬序列点。它确保了从左到右的评估,没有串扰。

如果您改为使用+,则不会有排序保证。所以这取决于您使用的操作员。 C ++ 17增加了一些具有严格排序保证的运算符(例如<<)。