目录
1. 语法格式
| explicit | (1) | ||||||||
| explicit ( expression ) | (2) | (C++20 及之后版本) | |||||||
expression :上下文转换后的 bool 类型常量表达式。
用途:
(a) 指定构造函数或转换函数(c++11 及之后版本)或推导指南(c++17及之后版本)为显式的,即其不能用于隐式转换或复制初始化(复制初始化其实也是隐式转换)。
(b) explicit指定符可以与常量表达式一起使用。当且仅当该常量表达式的值为true时,该函数才是显式的。
注意事项:在 C++11 之前,如果构造函数没有使用 explicit 函数说明符,且只有一个非默认参数,则该构造函数称为转换构造函数。
构造函数(复制/移动函数除外)和用户定义的转换函数都可以是函数模板;explicit 的含义不变。
跟在explicit后的一个左括号“(”总是解析为 explicit指定符的一部分:
struct S
{
explicit (S)(const S&); // error in C++20, OK in C++17
explicit (operator int)(); // error in C++20, OK in C++17
};
2. 示例
struct A
{
A(int) {} // 转换构造函数
A(int, int) {} // 转换构造函数 (C++11)
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: 复制初始化选择 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转换(c语言风格)
if (a1) { } // OK: A::operator bool()
bool na1 = a1; // OK: 复制初始化选择 A::operator bool()
bool na2 = static_cast<bool>(a1); // OK: 静态转换执行static_cast
// c++ 风格强制转换
// B b1 = 1; // error: 复制初始化不考虑 B::B(int)
B b2(2); // OK: 直接初始化选择 B::B(int)
B b3 {4, 5}; // OK: 直接列表初始化选择 B::B(int, int)
// B b4 = {4, 5}; // error: 复制列表初始化不考虑 B::B(int, int)
B b5 = (B)1; // OK: 显示转换执行 static_cast
if (b2) { } // OK: B::operator bool()
// bool nb1 = b2; // error: 复制列表不考虑 B::operator bool()
bool nb2 = static_cast<bool>(b2); // OK: static_cast 执行直接初始化
//lambda表达式,匿名函数,啥也不做:… 表示无限参数,最后括号表示立即调用,传参
[](...){}(a4, a5, na1, na2, b5, nb2); // 屏蔽 “unused variable” 警告
}

3万+

被折叠的 条评论
为什么被折叠?



