C++17 标准通过规则 stating, to the effect 修改了 C++ 语言的操作顺序的定义:



但是,在使用 -std=c++17-Wall 在 GCC 8.1 中编译以下代码时

int v[] { 0,1,2,3,4,5,6,7 };
int *p0 = &v[0];
*p0++ = *p0 + 1;
cout << "v[0]: " << v[0] << endl;

我收到以下警告:
main.cpp:266:8: warning: operation on 'p0' may be undefined [-Wsequence-point]
     *p0++ = *p0 + 1;
      ~~^~

输出是:
v[0]: 1
问题是:警告是错误的吗?

最佳答案



这取决于。

从技术上讲,有问题的代码定义明确。在 C++17 中,右侧排序在左侧之前,而在不确定排序之前。并且 gcc 正确编译代码,在该赋值之后 v[0] == 1

然而,这也是不应该写的糟糕代码,所以虽然警告的具体措辞是错误的,但警告的实际精神对我来说似乎很好。至少,我不打算提交关于它的错误报告,而且它似乎不值得开发人员花时间修复。天啊。

关于C++17 排序 : post-increment on left side of assignment,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52762511/

10-11 17:57