在cout语句中首先运行什么?(C++ 17)

iZe*_*ify 1 c++ cout operator-overloading operator-precedence c++17

比方说,我有一个很长的声明

cout << findCurrent() << "," << findLowest() << "," << findHighest() << "," << findThird()<<"\n";

会像逻辑指令一样findCurrent()运行findLowest()吗?

M.M*_*M.M 6

从C++ 17开始,函数保证从左到右调用,即findCurrent()先调用,然后调用,findLowest()依此类推.

C++ 17标准参考:[expr.shift]/4(指表达式E1 << E2):

表达式E1在表达之前进行测序E2.

[over.match.oper]/2 :(描述重载的运算符)

操作数按照内置运算符规定的顺序排序.

[intro.execution]/15:

表达X被认为是前测序的表达Y,如果每个值的计算和与表达相关联的每个副作用X被每一个值的计算和与表达相关联的每个副作用之前测序Y.

链接到cppreference摘要


在C++ 17之前,函数调用的顺序是未指定的,这意味着它们可以按任何顺序调用(并且在重复调用时此顺序不需要相同).

  • 有趣的是如何花费数十年才能将一个简单的句子写入标准中来解决所有疑问. (2认同)
  • @DeiDei很长一段时间以来,有人认为保留未指定允许优化器通过使用最快的调用顺序生成更快的代码; 然而,证据并没有真正支持这一点,并且在一个着名的事件中,他们针对新的评估订单构建了Windows NT内核,它实际上加速了它 (2认同)