explicit
explicit 修饰构造函数
防止构造函数中的复制初始化和隐式转换
复制初始化:
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 的隐式转换
explicit修饰转换函数
防止隐式转换,但允许按语境转换
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() 的对象不可以隐式转换