次のコードを検討してください。
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++ } ;
^ ~~
私はこのようなコードを推奨しているわけではありませんが、同様のコードが別の質問で出てきて、C++11より前の標準に従って定義されているかどうかについて意見の相違がありました。C++ 11 では、この動作はAre multiple Mutation within initializer lists undefined behaviorに従って明確に定義された動作であり、実際に使用すると警告が消えます。-std=c++11
C++11より前の ドラフト標準を見ると、initializer-listをカバーする同じ言語がないため、Chapter 5
式のパラグラフ4が残っているようです。
特に明記されていない限り、個々の演算子のオペランドと個々の式の部分式の評価の順序、および副作用が発生する順序は規定されていません。57)前のシーケンス ポイントと次のシーケンス ポイントの間で、スカラー オブジェクトは、式の評価によって最大 1 回変更された格納された値を持たなければなりません。さらに、保存する値を決定するためにのみ、前の値にアクセスする必要があります。この段落の要件は、完全な式の部分式の許容される順序ごとに満たされるものとします。それ以外の場合、動作は未定義です。
これを未定義にするためには、式として、したがってそれぞれを部分式count++, count++
として解釈する必要があるように思われるので、このコードはC++11より前に未定義ですか?count++