【发布时间】:2014-11-13 14:38:15
【问题描述】:
在标准的早期版本 (C++03) 中,未指定对函数调用的参数求值顺序。
这在标准的后续版本(C++11 或 C++14)中是否已更改?
即我们是否可以依赖特定的顺序(从左到右)。
【问题讨论】:
标签: c++ parameters operator-precedence
在标准的早期版本 (C++03) 中,未指定对函数调用的参数求值顺序。
这在标准的后续版本(C++11 或 C++14)中是否已更改?
即我们是否可以依赖特定的顺序(从左到右)。
【问题讨论】:
标签: c++ parameters operator-precedence
不,这并没有改变,但最近有一个改变它的提议:N4228: Refining Expression Evaluation Order for Idiomatic C++,这是Pre-Urbana mailing that came out this October 的一部分,介绍说(强调我的前进): p>
表达式求值顺序是 C++ 社区。简而言之,给定一个表达式,例如 f(a, b, c), 子表达式 f , a , b , c 的求值顺序 标准未指定。如果其中任何两个 子表达式碰巧在不干预的情况下修改了同一个对象 序列点,程序的行为是未定义的。为了 例如,表达式 f(i++, i) 其中 i 是一个整数变量 导致未定义的行为
它建议:
我们建议修改 C++ 评估规则以支持已有数十年历史的 惯用构造和编程实践。一个简单的解决方案 将要求每个表达式都有一个明确的定义 评价顺序。该建议历来遭到反对 很多原因。相反,这提出了一个更有针对性的修复方法
- 后缀表达式从左到右计算。 这包括 函数调用和成员节表达式。
- 赋值表达式从右到左计算。这包括复合作业。
- 移位运算符的操作数从左到右计算
更新
Herb Sutter 最近在put out a poll on order of evaluation 寻求社区的一些反馈,以了解我们对以下代码的预期结果:
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;
这似乎表明委员会正在认真考虑评估顺序的主题,但正如我们从讨论中看到的那样,这是有争议的。
【讨论】:
不,它在 C++11 中仍未指定。这样您的编译器就可以进行微优化,从而提高代码质量,并且因编译器而异。尝试 printf 在不同的编译器上进行增量操作。
函数如 int i = foo(3) + bar(0);有未定义的行为,没有函数可以保证先运行。
【讨论】: