initializerの説明が難しい。一体どうすればいいのか。
とりあえず、規格にしたがって、zero-initialize、default-initialize、value-initializeの説明を書いた。これは、まだ分かりやすい。
初期化子の文法も分かりにくい。基本的には、三つある。
1. 初期化子を書かない。
T x ;
2. = に続けて式。
T x = a ;
この形の初期化子を、コピー初期化(copy-initialization)という。ただし、ここでのコピーは、コピー、ムーブのコピーとは関係がない。コピー初期化でも、ムーブはされる。
3. コンストラクター呼び出しに似た形。
T x(a) ; T x{a} ;
この形の初期化子を、直接初期化(direct-initialization)という。
とこう書くと、非常に種類が少なく、分かりやすいように思われる。しかし、以下の形の初期化子は、別物のように見えてしまう。
T x = { 1, 2, 3 } ; T x( { 1, 2, 3 } ) ;
一番難しいのが、初期化がどのように行われるかという具体的な決定方法だ。これは、非常に複雑だ。ユーザー定義の変換関数やオーバーロード解決も絡んでくるためだ
問題は、この初期化の仕組を詳細に解説しても、あまり現実のプログラミングには役に立たないのだ。初期化の仕組みは、詳細なルールを知らなくても、普通のユーザーが普通に使えるように設計されている。もちろん、いくつか落とし穴はあるが。
No comments:
Post a Comment