为什么C ++ 17 GCC编译器会发出关于undefined的警告?

时间:2017-12-07 13:49:16

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

根据C ++ 17,无法保证以下表达式的评估顺序。它被称为未指定的行为。

subnet_id  = "${data.terraform_remote_state.env-shared.subnet-aza-${var.environment}"

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

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

我不明白,在上面的c ++ 17中表达不再是未定义的行为,然后为什么编译器会发出有关未定义的警告?

1 个答案:

答案 0 :(得分:5)

似乎像gcc一样发出警告,因为这是一个极端情况,或者至少非常接近于一个。便携性似乎是一个问题。

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

  

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

     

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