在下面的类(class)中,
你为什么要把运算符设置为explicit
。我以为explicit
是为了防止构造函数的隐式调用?
class Content
{
public:
virtual ~Content() = 0;
virtual explicit operator float&();
virtual explicit operator long long&();
virtual explicit operator std::string&()
}
最佳答案
从C++ 11开始,它也适用于user-defined conversions(又称强制转换运算符)。
在此上下文中使用的explicit
关键字使转换仅适用于直接初始化和显式转换。请参阅[class.conv.fct¶2]下的内容:
这有助于您确保编译器不会针对您的意图尝试进行转换,以便您必须自己明确地进行转换,从而留出更少的错误空间。例子:
struct Foo
{
explicit operator int() {return 0;}
operator int*() {return nullptr;}
};
int main()
{
Foo foo;
//int xi = foo; // Error, conversion must be explicit
int i = static_cast<int>(foo); // OK, conversion is explicit
int* i_ptr = foo; // OK, implicit conversion to `int*` is allowed
int i_direct(foo); // OK, direct initialization allowed
int* i_ptr_direct(foo); // OK, direct initialization after implicit conversion
return 0;
}
在应用多个转换选项的情况下,它还可以帮助解决歧义,使编译器没有选择哪个标准的决定标准:
struct Bar
{
operator int() {return 1;}
operator char() {return '1';}
};
int main()
{
Bar bar;
//double d = bar; // Error, implicit conversion is ambiguous
return 0;
}
添加
explicit
:struct Bar
{
operator int() {return 1;}
explicit operator char() {return '1';}
};
int main()
{
Bar bar;
double d = bar; // OK, implicit conversion to `int` is the only option
return 0;
}
关于c++ - 显式关键字应用于运算符,而不是构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52482976/