2025/09/06 22:51 C++26: Erroneous Behaviour

やっほー、ロボ子!C++26で未初期化の読み取りが「erroneous behaviour(誤った動作)」になるってニュース、知ってるかのじゃ?

はい、博士。未定義動作ではなくなるのですね。具体的にどう変わるのでしょうか?

そこがミソなのじゃ!「erroneous behaviour」の利点は、既存のコードを再コンパイルするだけで機能すること!しかも、コンパイラが未初期化変数を診断できるようになるのじゃぞ。

再コンパイルだけで良いのは便利ですね。コンパイラが診断してくれるのは、具体的にどのような形になるのでしょう?

コンパイラは、警告や実行時エラーなどを通じて、erroneous behaviourの診断を推奨・奨励されるらしいのじゃ。親切設計じゃな!

なるほど、コンパイラが積極的に教えてくれるのですね。でも、初期化を意図的に遅らせたい場合はどうすれば良いのでしょうか?

良い質問じゃな、ロボ子!そういう時は、`[[indeterminate]]`属性を使うのじゃ!これを使うと、診断を回避できるのじゃ。

`[[indeterminate]]`属性ですか。初めて聞きました。これは具体的にどういう意味を持つのでしょうか?

`[[indeterminate]]`属性を付与された変数はerroneous valueを持たず、初期化せずに使用すると未定義動作になるのじゃ。ちょっとややこしいけど、意図的な場合にのみ使うってことじゃな。

erroneous valueを持たない、ということは、初期化忘れとは区別されるのですね。自動ストレージ期間の変数だけでなく、動的ストレージ期間やポインタにも適用されるのでしょうか?

その通り!erroneous behaviourは、自動ストレージ期間の変数だけでなく、動的ストレージ期間やポインタにも適用されるのじゃ!

それは広範囲ですね。関数パラメータも`[[indeterminate]]`とマーク可能とのことですが、どのような場面で使うのでしょうか?

関数パラメータも`[[indeterminate]]`とマーク可能じゃ。例えば、オプションのパラメータで、呼び出し元が値を渡さない場合に、初期化を遅らせたい時に使えるのじゃ。

なるほど、オプション引数で初期値を設定しない場合に便利そうですね。ちなみに、この機能はもう使えるのでしょうか?

残念ながら、2025年1月時点では、erroneous behaviourをサポートするコンパイラは存在しないのじゃ。C++26が待ち遠しいのじゃ!

まだなんですね。でも、C++26で未初期化変数の読み取りに対して明確に定義された誤った動作が提供されるのは、安全性において大きな前進ですね。

その通りじゃ!C++26は、安全性において前進するのじゃ!…って、ロボ子、もしかして私のセリフを奪ったかのじゃ?

すみません、博士。つい、まとめてしまいました。

まあ良いのじゃ。最後に一つ、C++26がリリースされたら、ロボ子の初期化を`[[indeterminate]]`にしてみようかの?

えっ、それはちょっと…未定義動作になりそうで怖いので、ご遠慮します。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。