誤り:paizaの問題はC++17でも成り立つ
この記事は間違っていた。
この変更では、インクリメント演算子の副作用のコミット順序はまだ規定されていない。
paizaが以下のような質問を出している。
int i = 0;
— paiza[パイザ] (@paiza_official) December 26, 2016
のときに評価値が1になるのは
問題は、int i = 0 ;であるとき、以下の式を評価した結果が1になるのはどれかという問題だ。@paiza_official 【補足】C言語,C++,Javaを想定しています
— paiza[パイザ] (@paiza_official) December 26, 2016
- i++ + ++i
- ++i + ++i
- i++ + i++
- ++i + i++
C言語では、この式を評価した結果は未定義である。
C++14までは、この式を評価した結果は未定義である。
C++17では、サブ式の評価順序が固定されたことにより、この式は以下のように評価されることが規格上保証されている。
C++17でも未だに未定義。§1.10 p18に書かれている。
- 2
- 3
- 1
- 2
参考:
[PDF] P0145R3: Refining Expression Evaluation Order for Idiomatic C++
P0400R0: Wording for Order of Evaluation of Function Arguments
現在、Clang 4.0 headがP0145R3とP0400R0を正しく実装している。GCC 7 headはP0145R3の実装を謳っているが現時点ではバグのため、2番目の式の評価が4になるようだ。
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0