考虑以下代码:
int main()
{
int count = 0 ;
int arrInt[2] = { count++, count++ } ;
return 0 ;
}
如果我们使用它编译代码clang -std=c++03
会产生以下警告(现场示例):
warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
int arrInt[2] = { count++, count++ } ;
^ ~~
我不提倡使用这样的代码,但类似的代码出现在另一个问题中,并且对于它是否根据标准 pre -C++11定义存在分歧。在C++11中,这种行为是明确定义的行为,根据Are multiple mutation within initializer 列出未定义的行为,实际上如果我使用,那么警告就会消失。-std=c++11
如果我们查看C++11之前的 草案标准,它没有相同的语言覆盖初始化器列表,所以我们似乎只剩下Chapter 5
表达式第4段,它说:
除非另有说明,否则未指定单个运算符的操作数和单个表达式的子表达式的求值顺序,以及副作用发生的顺序。57)在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先验值以确定要存储的值。对于完整表达式的子表达式的每个允许排序,都应满足本段的要求;否则行为未定义。
为了使其未定义,似乎我们必须将其解释count++, count++
为表达式,因此每个都解释count++
为子表达式,那么这段代码在C++11之前是否未定义?