在下面的课程中,
为什么要让运算符明确.我认为明确是为了防止对构造函数的隐式调用?
class Content { public: virtual ~Content() = 0; virtual explicit operator float&(); virtual explicit operator long long&(); virtual explicit operator std::string&() }
解决方法
I thought that explicit was to prevent implicit calling of
constructors?
从C 11开始,它也适用于user-defined conversions(也就是演员操作符).
Why would you make the operators
explicit
在此上下文中使用,explicit关键字使转换仅适用于直接初始化和显式转换.见[class.conv.fct¶2]:
A conversion function may be explicit ([dcl.fct.spec]),in which case
it is only considered as a user-defined conversion for
direct-initialization ([dcl.init]). Otherwise,user-defined
conversions are not restricted to use in assignments and
initializations.
这有助于您确保编译器不会针对您的意图尝试转换,因此您必须自己明确地进行转换,从而减少出错的空间.例:
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; }
添加明确:
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; }