c – 应用于运算符而不是构造函数的显式关键字
在下面的课程中,
为什么要让运算符明确.我认为明确是为了防止对构造函数的隐式调用? 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; } 添加明确: 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |