int(3) とかそういうのはもういいとして、 int x(1) とかその辺の話し。
最終的にどう初期化されるのかまでは元記事が追記で説明してしまってるのだが、
なんでこんなんあるのかみたいな所の話しがないので、個人的に到達した結論。
そもそも何でクラスとプリミティブな型の初期化時の構文を合わせる必要があるのか、だけど
クラスのメンバー変数の初期化リストを記述する時に、クラスのコンストラクタ呼出しと同じような記法でプリミティブ型も初期化できるようにする為だと思う。
class Test{ int a,b; public: Test() : a(5), b(){ } }
こーゆーこと。
ここでは『変数名()』の形で記述する事が認められていて、クラスと同じように書けるようになっている。
統一感を出す為なのか、同様に宣言の所でも int x(n);で初期化できるようにしたが、
int x();
のように引き数を省いた初期化は変数の宣言と見分けが付かない。
(これは同様にクラスでも 明示的にデフォルトコンストラクタを呼び出す形に () を付けた宣言はできない。
しかしクラスは
Test x;
でコンストラクタが走る。
プリミティブ型はクラスと違ってインスタンス生成がないのでコンストラクタは走らないが、
int x;
で、スタック領域に配置される。
しかしこの段階では初期化が行なわれないので、変数の値は不定である。
この辺は C との互換を守る為にはどうしようもない部分。
そんなこんなで、『変数名()』 で 特定の場所だけ初期化できるけど全体的に統一感に欠けるのはその辺の互換絡みの しがらみの所為なのかな。
妄想に裏付けを
ここまでは全て想像で書いているので、裏付けとかが欲しいので明日もうちょっと調べてみようかなぁ。
誰か仕様策定の経緯に詳しい人がいたら、是非なんかブコメとかでもいいので教えてもらいたい。
「 こうゆう理由でプリミティブ型の初期化構文はクラスに合わす事を強いられているんだ!」みたいな感じで。
コメントする