【问题标题】:Order of Evaluation for Fold Expressions折叠表达式的求值顺序
【发布时间】:2018-02-13 19:49:35
【问题描述】:

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

考虑:

#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

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

【问题讨论】:

  • 你使用逗号操作符,它是有序的。

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


【解决方案1】:

运算符的右折叠扩展如下:... (arg0 op (arg1 op arg2))。因此,虽然括号有帮助,但它们不能保证各个元素的顺序。

因此,这一切都留给opcomma operator(与分隔函数参数的逗号不同),即使是 C++17 之前的版本,也是一个硬序列点。它确保从左到右的评估没有串扰。

如果您改为使用+,则不会有排序保证。所以这取决于你使用的运营商。 C++17 添加了更多具有严格排序保证的运算符(例如&lt;&lt;)。

【讨论】:

  • 供参考:在 C++17 中为我们提供更严格排序保证的提案是P0145r3。这也保证了重载逗号运算符不会删除排序保证。
猜你喜欢
  • 2020-11-29
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多