- explicit 修飾構造函數時,可以防止隱式轉換和複製初始化。
- explicit 修飾轉換函數時,可以防止隱式轉換,但按語境轉換除外。
explicit 使用
struct A
{
A(int) { }
operator bool() const { return true; }
};
struct B
{
explicit B(int) {}
explicit operator bool() const { return true; }
};
void doA(A a) {}
void doB(B b) {}
int main()
{
A a1(1); // OK:直接初始化
A a2 = 1; // OK:複製初始化
A a3{ 1 }; // OK:直接列表初始化
A a4 = { 1 }; // OK:複製列表初始化
A a5 = (A)1; // OK:允許 static_cast 的顯式轉換
doA(1); // OK:允許從 int 到 A 的隱式轉換
if (a1); // OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a6(a1); // OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a7 = a1; // OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a8 = static_cast<bool>(a1); // OK :static_cast 進行直接初始化
B b1(1); // OK:直接初始化
B b2 = 1; // 錯誤:被 explicit 修飾構造函數的對象不可以複製初始化
B b3{ 1 }; // OK:直接列表初始化
B b4 = { 1 }; // 錯誤:被 explicit 修飾構造函數的對象不可以複製列表初始化
B b5 = (B)1; // OK:允許 static_cast 的顯式轉換
doB(1); // 錯誤:被 explicit 修飾構造函數的對象不可以從 int 到 B 的隱式轉換
if (b1); // OK:被 explicit 修飾轉換函數 B::operator bool() 的對象可以從 B 到 bool 的按語境轉換
bool b6(b1); // OK:被 explicit 修飾轉換函數 B::operator bool() 的對象可以從 B 到 bool 的按語境轉換
bool b7 = b1; // 錯誤:被 explicit 修飾轉換函數 B::operator bool() 的對象不可以隱式轉換
bool b8 = static_cast<bool>(b1); // OK:static_cast 進行直接初始化
return 0;
}