変換コンストラクタ
From cppreference.com
explicit 指定子で宣言されていないコンストラクタは、単一のパラメータで呼び出すことができ、(C++11まで) 変換コンストラクタと呼ばれます。
直接初期化(static_cast などの明示的な変換を含む)の場合にのみ考慮される explicit コンストラクタとは異なり、変換コンストラクタはユーザー定義の変換シーケンスの一部としてコピー初期化の場合にも考慮されます。
変換コンストラクタは、その引数(もしあれば)の型からそのクラスの型への暗黙的な変換を指定すると言われます。非 explicit のユーザー定義変換関数も暗黙的な変換を指定することに注意してください。
暗黙的に宣言され、ユーザー定義された非 explicit のコピーコンストラクタおよびムーブコンストラクタは変換コンストラクタです。
[編集] 例
このコードを実行
struct A { A() { } // converting constructor (since C++11) A(int) { } // converting constructor A(int, int) { } // converting constructor (since C++11) }; struct B { explicit B() { } explicit B(int) { } explicit B(int, int) { } }; int main() { A a1 = 1; // OK: copy-initialization selects A::A(int) A a2(2); // OK: direct-initialization selects A::A(int) A a3{4, 5}; // OK: direct-list-initialization selects A::A(int, int) A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int) A a5 = (A)1; // OK: explicit cast performs static_cast, direct-initialization // B b1 = 1; // error: copy-initialization does not consider B::B(int) B b2(2); // OK: direct-initialization selects B::B(int) B b3{4, 5}; // OK: direct-list-initialization selects B::B(int, int) // B b4 = {4, 5}; // error: copy-list-initialization selected an explicit constructor // B::B(int, int) B b5 = (B)1; // OK: explicit cast performs static_cast, direct-initialization B b6; // OK, default-initialization B b7{}; // OK, direct-list-initialization // B b8 = {}; // error: copy-list-initialization selected an explicit constructor // B::B() [](...){}(a1, a4, a4, a5, b5); // may suppress "unused variable" warnings }