转换构造函数
從 cppreference.com
不以說明符 explicit 聲明且可以用單個參數調用(C++11 前)的構造函數被稱為轉換構造函數(converting constructor)。
與只在直接初始化(包括如 static_cast 這樣的顯式轉換)中被考慮的顯式構造函數不同,轉換構造函數也會作為用戶定義的轉換序列中的一部分而在複製初始化的考慮範圍內。
通常說法是轉換構造函數指定了一個從它的各實參類型(如果存在)到它的類類型的隱式轉換。注意非顯式的用戶定義轉換函數也指定了一個隱式轉換。
隱式聲明的及用戶定義的非顯式複製構造函數與移動構造函數也是轉換構造函數。
[編輯] 示例
運行此代碼
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}; // 错误:复制列表初始化选择了显式构造函数 B::B(int, int) B b5 = (B)1; // OK:进行 static_cast 显式转换,是直接初始化 B b6; // OK:默认初始化 B b7{}; // OK:直接列表初始化 // B b8 = {}; // 错误:复制列表初始化选择了显式构造函数 B::B() [](...){}(a1, a4, a4, a5, b5); // 可能会抑制 "未使用的变量" 警告 }