【问题标题】:Why does C++17 GCC compiler gives warning about undefined?为什么 C++17 GCC 编译器会给出未定义的警告?
【发布时间】:2017-12-07 13:49:15
【问题描述】:

根据 C++17,不保证以下表达式中的计算顺序。它被称为未指定的行为。

int i = 0;
std::cout<<i<<i++<<std::endl;

C++17 GCC 编译器给出以下警告:Live Demo

prog.cc: In function 'int main()':
prog.cc:6:20: warning: operation on 'i' may be undefined [-Wsequence-point]
     std::cout<<i<<i++<<std::endl;

我不明白,在上面的c++17中不再表达未定义的行为,那么为什么编译器会给出未定义的警告?

【问题讨论】:

标签: c++ undefined-behavior c++17 gcc-warning


【解决方案1】:

似乎 gcc 会发出警告,因为这是一个极端情况,或者至少非常接近。可移植性似乎是一个问题。

来自https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html页面

C++17 标准将在更多情况下定义操作数的求值顺序:特别是它要求赋值的右手边在左手边之前求值,所以上面的例子不再是不明确的。但是这个警告仍然会警告他们,以帮助人们避免编写在 C 和 C++ 早期版本中未定义的代码。

该标准的措辞令人困惑,因此对于微妙情况下序列点规则的确切含义存在一些争论。可以在 GCC 阅读页面http://gcc.gnu.org/readings.html 上找到该问题讨论的链接,包括建议的正式定义。

【讨论】:

  • 第二段似乎不是指新的 C++17 规则,而是指 C(以及 C++11 之前的 C++)的旧序列点规则。
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多