コードに含まれる「デフォルトコンストラクタ」はありません。クラス型のみがコンストラクターを持つことができます。スカラー型には、デフォルトまたはそれ以外のコンストラクターはありません。
構文は、T()
いわゆるvalue-initializationによって初期化された一時オブジェクトを作成します。値の初期化は、クラスタイプのみ、およびユーザー定義のコンストラクター(C ++ 11ではいくつかのニュアンスがある)を持つコンストラクター呼び出しにのみ解決されます。他のタイプの場合、値の初期化にはコンストラクターはまったく含まれません。これは、コンストラクターを使用せずに、データの初期値を直接定義する独自のかなり複雑な初期化ルールに従って進行します(言語仕様の8.5を参照)。
スカラー型の場合、value-initializationはゼロ初期化を実行します。これが、コードがゼロを出力することが保証されている理由です。抽象初期化プロセスの正確な詳細は、C ++言語標準のバージョン間で変更されましたが、時代の初めから、C++言語はT()
式T == int
がゼロに評価されることを保証していました。つまり、C ++ 98でも、コードはゼロを出力します。
T(...)
これらすべての式がどういうわけかコンストラクター呼び出しを必然的に暗示しているというのはよくある誤解です。実際には、T(...)
式は(引数の数に関係なく)機能的なキャスト式であり(言語仕様の5.2.3を参照)、特定の状況の狭いセットでコンストラクター呼び出しに解決される可能性があり、のコンストラクターとは関係ありません。他の状況。
たとえば、このコード
struct S { int x, y; };
S s = S();
クラスにはデフォルトのコンストラクターがあるにもかかわらず、s
ゼロ(s.x
との両方)で初期化されることが保証されています。この例は、デフォルトのコンストラクターが存在する状況でも、式がそれを完全に無視し、代わりに独自のルールで機能するという事実を具体的に示すために作成しました。s.y
S
T()