本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

誤り:paizaの問題はC++17でも成り立つ

この記事は間違っていた。

この変更では、インクリメント演算子の副作用のコミット順序はまだ規定されていない。

paizaが以下のような質問を出している。

int i = 0;
のときに評価値が1になるのは

— paiza[パイザ] (@paiza_official) December 26, 2016

@paiza_official 【補足】C言語,C++,Javaを想定しています

— paiza[パイザ] (@paiza_official) December 26, 2016
問題は、int i = 0 ;であるとき、以下の式を評価した結果が1になるのはどれかという問題だ。
  1. i++ + ++i
  2. ++i + ++i
  3. i++ + i++
  4. ++i + i++

C言語では、この式を評価した結果は未定義である。

C++14までは、この式を評価した結果は未定義である。

C++17では、サブ式の評価順序が固定されたことにより、この式は以下のように評価されることが規格上保証されている。

C++17でも未だに未定義。§1.10 p18に書かれている。

  1. 2
  2. 3
  3. 1
  4. 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