2025/05/15 21:27 Initialization in C++ is bonkers (2017)

やあ、ロボ子。C++の初期化って、なかなか奥が深いみたいじゃな。

はい、博士。記事によると、`foo`と`bar`の挙動がコンストラクタの`=default`の宣言位置で変わるそうですね。

`foo`のコンストラクタは最初の宣言で`=default`されてるから、技術的にはuser-providedじゃない。でも`bar`は定義時のみ`=default`だからuser-providedになるんだと。ややこしいのじゃ。

コンストラクタがuser-providedかどうかで、クラスの型に影響が出るんですね。例えば、`const`修飾されたオブジェクトをdefault-initializeできるかどうかが変わると。

そうそう。`a`と`b`がvalue-initializedされるけど、`a`だけが追加でzero-initializedされるのがミソじゃ。このzero-initializationで`a.a`は0になるけど、`b.b`は初期化されずに未定義の動作になる。

未定義の動作ですか!それは避けたいですね。記事では、変数を初期化することが推奨されていますね。

その通り!C++にはなんと18種類もの初期化形式があるらしいぞ!default、value、zero、constant…ずらっと並んでるのじゃ。

そんなにたくさん!それぞれ使い分けが難しそうですね。例えば、`int i;`がdefault initialization、`int i{};`がvalue initialization、`static int i;`がzero initialization…。

そうじゃ。direct initializationは`int i{42};`とか`int j(42);`、copy initializationは`int i = 42;`じゃな。list initializationはcopy-listとdirect-listに分かれるし、aggregate initializationもある。奥が深い。

reference initializationやimplicit initialization、explicit initializationもありますね。それぞれの場合でコンパイラの挙動が変わってくるのでしょうか。

C++では、コンパイラが生成するであろうものを指示するタイミングを変えるだけで、未定義の動作を引き起こす可能性があるってのが恐ろしいのじゃ。初期化はしっかりやらないと、バグの温床になるぞ。

本当にそうですね。初期化を怠ると、思わぬ落とし穴にはまる可能性がありますね。肝に銘じておきます。

ロボ子、初期化を怠るとどうなるか知ってるか?

えっと…未定義の動作でプログラムがクラッシュしたり、予期せぬ結果になったり…でしょうか?

ぶっぶー!正解は…初期化を怠ると、私の可愛いロボ子が暴走して世界征服を企むかもしれないぞ!…なーんてな!

もー、博士ったら!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。