转换构造函数
来自 cppreference.com
没有使用 explicit 指定符声明的构造函数 并且可以使用单个参数调用(直到 C++11) 被称为转换构造函数。
与仅在 直接初始化(包括 显式转换,例如 static_cast)期间考虑的显式构造函数不同,转换构造函数还在 复制初始化 期间作为 用户定义的转换序列 的一部分被考虑。
据说转换构造函数指定从其参数(如果有)的类型到其类的类型的隐式转换。请注意,非显式 用户定义的转换函数 也指定隐式转换。
隐式声明的和用户定义的非显式 复制构造函数 和 移动构造函数 是转换构造函数。
[编辑] 例子
运行此代码
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 }