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