强制转换操作符可以是显式的吗?
Can a cast operator be explicit?
当涉及到构造函数时,添加关键字explicit
可以防止热心的编译器创建一个不是程序员最初意图的对象。这种机制也适用于铸造操作符吗?
struct Foo
{
operator std::string() const;
};
在这里,例如,我希望能够将Foo
强制转换为std::string
,但我不希望这种强制转换隐式地发生。
是和否
这取决于你使用的是哪个版本的c++。
- c++ 98和c++ 03不支持
explicit
类型转换操作符 - 但是c++ 11可以。
,
struct A
{
//implicit conversion to int
operator int() { return 100; }
//explicit conversion to std::string
explicit operator std::string() { return "explicit"; }
};
int main()
{
A a;
int i = a; //ok - implicit conversion
std::string s = a; //error - requires explicit conversion
}
用g++ -std=c++0x
编译它,你会得到这个错误:
prog.cpp:13:20:错误:请求从'A'转换为非标量类型'std::string'
在线演示:http://ideone.com/DJut1
但是一旦你写:
std::string s = static_cast<std::string>(a); //ok - explicit conversion
错误消失:http://ideone.com/LhuFd
顺便说一下,在c++ 11中,如果显式转换操作符转换为布尔值,则将其称为"上下文转换操作符"。此外,如果您想了解更多关于隐式和显式转换的信息,请阅读此主题:- 隐式与显式转换
相关文章:
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- Clang vs GCC vs MSVC模板转换操作符-哪个编译器是正确的
- 模板类型转换操作符=
- 链接隐式转换操作符
- 强制转换操作符函数在g++中可以很好地编译,但在其他编译器中不行.为什么
- 当目标类有多个构造函数时,消除强制转换操作符的歧义
- 删除转换操作符
- 强制转换操作符重载和引用
- 实现没有临时的转换操作符
- 不同的强制转换操作符被不同的编译器调用
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- const转换操作符
- 调用转换操作符不能用于静态const变量
- 内部编译器错误-开关表达式中的模板化转换操作符
- 强制转换操作符可以是显式的吗?
- 不同的编译器使用不同的强制转换操作符
- 是否需要重载类的强制转换操作符?
- 类型转换操作符重载——Visual studio 2013内部错误
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc
- 是否有方法为任何指针类型定义转换操作符