C++ 参数顺序评估

C++ 参数顺序评估,c++,parameters,operator-precedence,C++,Parameters,Operator Precedence,在以前版本的标准(C++03)中,未指定函数调用参数的求值顺序 在标准的后续版本(C++11或C++14)中是否对其进行了更改? i、 e.我们是否可以依赖于具体的订购(从左到右)。不,这一点并没有改变,但最近有一项建议改变了这一点:,这是导言的一部分(重点在后面): 表达式求值顺序是中经常出现的讨论主题 C++社区。简而言之,给定一个表达式,如f(a,b,c), 子表达式f、a、b、c求值的顺序 标准中未指定。如果其中任何两个 子表达式在不进行干预的情况下修改同一对象 序列点,程序的行为未定义

在以前版本的标准(C++03)中,未指定函数调用参数的求值顺序

在标准的后续版本(C++11或C++14)中是否对其进行了更改?

i、 e.我们是否可以依赖于具体的订购(从左到右)。

不,这一点并没有改变,但最近有一项建议改变了这一点:,这是导言的一部分(重点在后面):

表达式求值顺序是中经常出现的讨论主题 C++社区。简而言之,给定一个表达式,如f(a,b,c), 子表达式f、a、b、c求值的顺序 标准中未指定。如果其中任何两个 子表达式在不进行干预的情况下修改同一对象 序列点,程序的行为未定义。对于 例如,表达式f(i++,i),其中i是一个整数变量 导致未定义的行为

它建议:

我们建议修订C++评估规则以支持几十年的历史。 惯用构造和编程实践。简单的解决办法 要求每个表达式都有一个定义良好的 评估顺序。这一建议传统上遭到了多年的抵制 各种原因。相反,这提出了一个更有针对性的解决方案

  • 后缀表达式从左到右求值这包括 函数调用和成员节表达式
  • 赋值表达式从右向左求值。这包括复合赋值
  • 移位运算符的操作数从左到右求值
更新

Herb Sutter最近正在寻求社区对以下代码的预期结果的反馈:

std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;
std::vector v={0,0};
int i=0;
v[i++]=i++;

std::coutNo在C++11中仍然没有指定。这样,编译器就可以进行微优化,从而提高代码的质量,而且每个编译器的性能都有所不同。在不同的编译器上尝试printf和增量操作


函数,如int i=foo(3)+bar(0);有未定义的行为,不保证先运行任何函数。

谢谢。但我很清楚没有具体说明的原因。但我听说该标准正在审查中,但不确定该变更是否已纳入最新标准。@LokiAstari您可能希望在您的问题中添加您听说该标准正在审查的细节。我想这就是你问这个问题的原因,但其他人可能不太清楚。这是针对即将到来的C++17还是仍在激烈讨论中?@LokiAstari很遗憾,我不是委员会的成员,所以我的洞察力非常有限,我在邮件出来后不久就阅读了这篇文章,这就是为什么我能够如此迅速地回答。这与缺陷报告无关,因此它似乎必须是C++17的一部分,假设讨论支持此建议。从过去的阅读和cppcon的各种对话来看,这似乎是一个有争议的提案。@ShafikYaghmour除非委员会的态度发生了很大变化,“这个提议可能已经被驳回了。@詹姆士坎茨我同意它会引起争议,但考虑到它针对的是一小部分表达,所以这种方法可能会减少阻力。