根据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中表达不再是未定义的行为,然后为什么编译器会发出有关未定义的警告?
答案 0 :(得分:5)
似乎像gcc一样发出警告,因为这是一个极端情况,或者至少非常接近于一个。便携性似乎是一个问题。
从页面https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
C ++ 17标准将在更多情况下定义操作数的评估顺序:特别是它要求在左侧之前评估赋值的右侧,因此以上示例不再未定义。但是这个警告仍然会警告他们,以帮助人们避免编写C语言和早期版本的C ++中未定义的代码。
标准措辞令人困惑,因此在细微情况下对序列点规则的确切含义存在争议。有关问题讨论的链接,包括拟议的正式定义,可在GCC阅读页面http://gcc.gnu.org/readings.html找到。