explicit(顯式)關鍵字

  • 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章