转换构造函数

来自cppreference.com
< cpp‎ | language

不以指定符 explicit 声明且能以单参数调用 (C++11 前)的构造函数被称为转换构造函数

不同于只在直接初始化(包含例如 static_cast显示转换)中考虑的 explicit 构造函数,转换构造函数作为用户定义转换序列中的一部分,亦于复制初始化中受到考虑。

通常说法是转换构造函数指定从其参数类型(若存在)到其类类型的隐式转换。注意非 explicit 用户定义转换函数也指定一个隐式转换。

隐式声明的及用户定义的非 explicit 复制构造函数移动构造函数是转换构造函数。

[编辑] 示例

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()
}