explicit通常用于声明是否运行隐式转换:
cpp
struct A
{
explicit A(int) { }
};
int main()
{
A a1 = 10; //编译报错,不运行隐式的通过int构造A
A a2(10); //可以显示的构造
return 0;
}
C++20扩展了explicit,可以通过explicit(false)来禁用,或通过explicit(true)来启用explicit
cpp
constexpr bool if_exp = false;
struct A
{
explicit(if_exp) A(int) { } //禁用explicit
};
struct B
{
explicit(!if_exp) B(int) { } //启用explicit
};
int main()
{
A a = 10; //explicit被禁用,所以可以隐式构造
B b(10); //explicit被启用,所以只能显示构造
return 0;
}