変換コンストラクタ
提供: cppreference.com
指定子 explicit 付きで宣言されていない引数1個で呼ぶことができる (C++11未満)コンストラクタは変換コンストラクタと言います。
直接初期化 (static_cast などの明示的な変換を含みます) のときにのみ考慮される explicit コンストラクタと異なり、変換コンストラクタはコピー初期化のときにも (ユーザ定義変換シーケンスの一部として) 考慮されます。
変換コンストラクタは引数 (もしあれば) の型からそのクラスの型への暗黙の変換を規定すると言われています。 非 explicit ユーザ定義変換関数も暗黙の変換を規定することに注意してください。
暗黙に宣言されたおよびユーザ定義された非 explicit コピーコンストラクタおよびムーブコンストラクタは変換コンストラクタです。
例
Run this code
struct A
{
A() { } // 変換コンストラクタ (C++11以上)。
A(int) { } // 変換コンストラクタ。
A(int, int) { } // 変換コンストラクタ (C++11以上)。
};
struct B
{
explicit B() { }
explicit B(int) { }
explicit B(int, int) { }
};
int main()
{
A a1 = 1; // OK、コピー初期化は A::A(int) を選択します。
A a2(2); // OK、直接初期化は A::A(int) を選択します。
A a3{4, 5}; // OK、直接リスト初期化は A::A(int, int) を選択します。
A a4 = {4, 5}; // OK、コピーリスト初期化は A::A(int, int) を選択します。
A a5 = (A)1; // OK、明示的なキャストは static_cast (直接初期化) を行います。
// B b1 = 1; // エラー、コピー初期化は B::B(int) を考慮しません。
B b2(2); // OK、直接初期化は B::B(int) を選択します。
B b3{4, 5}; // OK、直接リスト初期化は B::B(int, int) を選択します。
// B b4 = {4, 5}; // エラー、コピーリスト初期化は explicit コンストラクタ B::B(int, int) を選択しました。
B b5 = (B)1; // OK、明示的なキャストは static_cast (直接初期化) を行います。
B b6; // OK、デフォルト初期化。
B b7{}; // OK、直接リスト初期化。
// B b8 = {}; // エラー、コピーリスト初期化は explicit コンストラクタ B::B() を選択しました。
}