在标准的早期版本 (C++03) 中,函数调用的参数求值顺序未指定。
标准的后续版本(C++11 或 C++14)是否对此进行了更改?
即我们是否可以依赖特定的顺序(从左到右)。
不,这没有改变,但最近有一个建议来改变这一点:N4228:细化表达式评估顺序
惯用的C++ http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4228.pdf,这是今年 10 月发布的预厄巴纳邮件 http://isocpp.org/blog/2014/10/pre-urbana简介说(强调我的前进):
表达式求值顺序是一个反复出现的讨论主题
C++ 社区。简而言之,给定一个表达式,例如 f(a, b, c),
子表达式 f 、 a 、 b 、 c 的求值顺序
标准未指定。如果其中任何两个
子表达式碰巧修改同一个对象而无需干预
序列点,程序的行为是未定义的。为了
例如,表达式 f(i++, i),其中 i 是整型变量
导致未定义的行为
它建议:
我们建议修改 C++ 评估规则以支持数十年历史
惯用的结构和编程实践。一个简单的解决方案
要求每个表达式都有一个明确定义的
评价顺序。这一建议传统上遭到了反对
很多原因。相反,这提出了更有针对性的修复
- 后缀表达式是从左到右计算的。这包括
函数调用和成员段表达式.
- 赋值表达式是从右到左计算的。这包括复合作业。
- 移位运算符的操作数从左到右计算
Update
赫伯·萨特最近寻找社区的一些反馈,了解我们期望从以下代码中获得什么结果:
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << endl;
这似乎表明委员会正在认真考虑评估顺序这一主题,但正如我们从讨论中看到的那样,这是有争议的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)