我将用++ + i ++在C++ 17中评估什么?

Leo*_*aar 24 c++ operator-precedence undefined-behavior language-lawyer c++17

看起来我们正在为C++获得全新的"面试问题"(我希望不是,实际上).

众所周知,在C++ 17之前,它是未定义的行为,但它是否会从C++ 17开始明确定义

由于目前似乎没有一个编译器实现了这个C++ 17修改,根据表达式评估规则,任何人都可以解释x在下面的代码中的值是什么?

int i = 0;
int x = i++ + i++;
Run Code Online (Sandbox Code Playgroud)

阿利斯代尔梅雷迪思提到这个例子在这里他CppCon 2016的谈话,但它并不完全清楚,我的最终值什么x会(虽然它似乎什么他要说的是,这将是至少1).

显然,i在这种情况下,本身将在表达式结尾处为2.

Nic*_*las 18

P0145R3(PDF)不会更改所有表达式的评估顺序.它只影响少数运营商.二进制加法不在该列表中.

因此,上述代码仍未定义.

  • 我敢肯定Alisdair说,但我确信P0145R3不同意他.P0145的旧版本确实提供了对二元运算符的排序,但目前的修订版本在范围上更为有限.因此,我将继续阅读论文中实际写的内容,而不是一些幻灯片. (2认同)