语法
explicit
explicit ( expression )
expression:根据上下文可以转换为bool类型的表达式
用法
- 指明构造函数、转换函数或推断指引(deduction guide)为显式,即不能用于隐式转换和复制初始化
- explicit说明符可以与常量表达式一起使用,当且仅当该常量表达式求值为 true 时,函数是显式的。可以理解为使用explicit的前提条件
- explicit说明符只能在类定义内的构造函数或转换函数的del-specifier-seq中出现
注解
转换构造函数
声明时不带explicit说明符的拥有单个无默认值形参(parameter)的构造函数
构造函数(除了复制或移动)和用户定义转换函数都可以是函数模板;explicit 的含义不变。
示例
struct A
{
A(int) {} // converting constructor
A(int, int) {} // converting constructor
operator bool() const {return true;}
};
struct B
{
explicit B(int) {}
explicit B(int, int) {}
explicit operator bool() const {return true;}
}
int main()
{
A a1=1; // ok: copy-initialization
B b1=1; // error: explicit 不允许 copy-initialization
A a2(2); // ok: direct-initialization
B b2(2); // ok: direct-initialization
A a3={4,5}; // ok: copy-list-initialization
B b3={4,5}; // error: explicit不允许copy-list-initialization
A a4{4,5}; // ok: direct-list-initialization
B b4{4,5}; // ok: direct-list-initialization
if (a1) { } // ok: A::operator bool()
if (b1) { } // ok: B::operator bool()
bool na1 = a1; // OK:复制初始化选择 A::operator bool()
bool na2 = static_cast<bool>(a1); // OK:static_cast 进行直接初始化
bool nb1 = b2; // 错误:复制初始化不考虑 B::operator bool()
bool nb2 = static_cast<bool>(b2); // OK:static_cast 进行直接初始化
}