2010-09-11

initializerの説明が難しい

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: