为什么C++17的GCC编译器会警告未定义?

4
根据C++17标准,以下表达式的评估顺序没有保证。这被称为未指定行为。
int i = 0;
std::cout<<i<<i++<<std::endl;

C++17 GCC编译器会出现以下警告:演示
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及以上版本中已经不存在未定义的行为,那么为什么编译器会发出未定义的警告?

看起来它在 i++ 操作上发出了警告。https://www.ibm.com/support/knowledgecenter/en/SSB23S_1.1.0.14/common/m1rhoseq.html。`i + 1` 不会引起警告。 - fredrik
您能否提供一个标准的链接,表明它是未指定的而不是未定义的? - Kevin
@Kevin https://dev59.com/yVkT5IYBdhLWcg3wf_pN - msc
它甚至不是未指定的,而是完全明确定义的。 - Matthijs
1个回答

5
似乎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之前的规则)。 - Matthijs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接