Default constructors
デフォルトコンストラクタは、 コンストラクタ であり、引数なしで呼び出すことができます。
目次 |
構文
class-name
(
parameter-list
(オプション)
);
|
(1) | ||||||||
class-name
(
parameter-list
(オプション)
)
function-body
|
(2) | ||||||||
class-name
() = default;
|
(3) | (C++11以降) | |||||||
class-name
(
parameter-list
(オプション)
) = delete;
|
(4) | (C++11以降) | |||||||
class-name
::
class-name
(
parameter-list
(オプション)
)
function-body
|
(5) | ||||||||
class-name
::
class-name
() = default;
|
(6) | (C++11以降) | |||||||
| class-name | - | デフォルトコンストラクタが宣言されているクラス |
| parameter-list | - | パラメータリスト で、すべてのパラメータが ( パラメータパック を除く) (C++11以降) デフォルト引数 を持つもの |
| function-body | - | デフォルトコンストラクタの 関数本体 |
説明
デフォルトコンストラクタは デフォルト初期化 および 値初期化 の際に呼び出されます。
暗黙的に宣言されるデフォルトコンストラクタ
クラス型にユーザー宣言されたコンストラクタまたはコンストラクタテンプレートが存在しない場合、コンパイラは暗黙的にデフォルトコンストラクタをそのクラスの inline public メンバーとして宣言します。
暗黙的に宣言された(または最初の宣言でデフォルト化された)デフォルトコンストラクタは、以下のように例外指定を持ちます: 動的例外指定 (C++17まで) noexcept指定 (C++17以降) 。
暗黙的に定義されるデフォルトコンストラクタ
もし コンストラクタが暗黙的に宣言されている場合 (C++11まで) 暗黙的に宣言された、または明示的にデフォルト化されたデフォルトコンストラクタが削除済みとして定義されていない場合 (C++11以降) 、コンパイラによって暗黙的に定義されるのは odr-used されるか、 定数評価に必要とされる場合 、または最初の宣言後に明示的にデフォルト化されたとき (C++11以降) です。
|
union-likeクラス
|
(C++26以降) |
暗黙的に定義されたデフォルトコンストラクタは、 (C++26まで) それ以外の場合、暗黙的に定義されたデフォルトコンストラクタは、 (C++26以降) 空の本体と空の初期化子リストを持つユーザー定義コンストラクタと同じ効果を持ちます。つまり、基底クラスとこのクラスの非静的メンバのデフォルトコンストラクタを呼び出します。空のユーザー提供コンストラクタを持つクラス型は、暗黙的に定義されたデフォルトコンストラクタを持つものとは異なる扱いを受ける可能性があります 値初期化 の間。
|
これが constexpr コンストラクタ (C++23まで) constexpr 関数 (C++23以降) の要件を満たす場合、生成されるコンストラクタは constexpr となります。 ユーザー定義のコンストラクタが存在する場合でも、ユーザーは default キーワードを使用して、暗黙的に宣言されるデフォルトコンストラクタの自動生成をコンパイラに強制することができます。 |
(C++11以降) |
削除されたデフォルトコンストラクタ
クラス
ユーザー定義のコンストラクタが存在せず、暗黙的に宣言されたデフォルトコンストラクタが自明でない場合でも、ユーザーはキーワード delete を使用して、コンパイラによる暗黙的に定義されたデフォルトコンストラクタの自動生成を抑制することができます。 |
(C++11以降) |
自明なデフォルトコンストラクタ
T
クラスのデフォルトコンストラクタは、以下の条件をすべて満たす場合、トリビアルとなります:
- コンストラクタは 暗黙的に宣言される (C++11まで) ユーザー提供ではない user-provided (C++11以降) 。
-
Tは仮想メンバー関数を持たない。 -
Tは仮想基底クラスを持たない。
|
(C++11以降) |
-
Tのすべての直接基底クラスは自明なデフォルトコンストラクタを持ちます。
|
(C++26まで) |
|
(C++26以降) |
自明なデフォルトコンストラクタは、何も処理を実行しないコンストラクタです。C言語と互換性のあるすべてのデータ型(POD型)は、自明にデフォルト構築可能です。
有効なデフォルトコンストラクタ
|
デフォルトコンストラクタは、ユーザー宣言されているか、暗黙的に宣言されかつ定義可能である場合に適格となる。 |
(C++11まで) |
|
デフォルトコンストラクタは、削除されていない場合に適格となる。 |
(C++11以降)
(C++20まで) |
|
デフォルトコンストラクタは、以下の条件をすべて満たす場合に適格となる: |
(C++20以降) |
有効なデフォルトコンストラクタの自明性は、クラスが 暗黙の生存期間型 であるかどうか、およびクラスが トリビアルコピー可能型 であるかどうかを決定します。
注記
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_trivial_union
|
202502L
|
(C++26) | 共用体の特殊メンバー関数に対する自明性要件の緩和 |
例
struct A { int x; A(int x = 1): x(x) {} // ユーザー定義のデフォルトコンストラクタ }; struct B : A { // B::B() は暗黙的に定義され、A::A() を呼び出す }; struct C { A a; // C::C() は暗黙的に定義され、A::A() を呼び出す }; struct D : A { D(int y) : A(y) {} // 他のコンストラクタが存在するため、D::D() は宣言されない }; struct E : A { E(int y) : A(y) {} E() = default; // 明示的にデフォルト化、A::A() を呼び出す }; struct F { int& ref; // 参照メンバ const int c; // const メンバ // F::F() は暗黙的に削除済みとして定義される }; // ユーザー宣言されたコピーコンストラクタ(ユーザー提供、削除済み、またはデフォルト化)は // デフォルトコンストラクタの暗黙的な生成を妨げる struct G { G(const G&) {} // G::G() は暗黙的に削除済みとして定義される }; struct H { H(const H&) = delete; // H::H() は暗黙的に削除済みとして定義される }; struct I { I(const I&) = default; // I::I() は暗黙的に削除済みとして定義される }; int main() { A a; B b; C c; // D d; // コンパイルエラー E e; // F f; // コンパイルエラー // G g; // コンパイルエラー // H h; // コンパイルエラー // I i; // コンパイルエラー }
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用バージョン | 公開時の仕様 | 修正後の仕様 |
|---|---|---|---|
| CWG 1353 | C++11 |
暗黙的に宣言されるデフォルトコンストラクタが削除済みとして定義される条件に
多次元配列型が考慮されていなかった |
これらの型を考慮する |
| CWG 2084 | C++11 |
デフォルトメンバ初期化子が、unionのデフォルト化された
デフォルトコンストラクタが削除済みかどうかに影響を与えなかった |
これらはデフォルト化されたデフォルトコンストラクタが
削除済みとなることを防止する |
| CWG 2595 | C++20 |
より制約されているが関連制約を満たさない別の
デフォルトコンストラクタが存在する場合、 デフォルトコンストラクタは適格ではなかった |
この場合でも適格となりうる |
| CWG 2871 | C++98 |
ユーザー宣言されたコンストラクタテンプレートが
存在する場合でもデフォルトコンストラクタが 暗黙的に宣言されていた |
この場合、暗黙的な宣言は行われない |