C++转换运算符

Mar*_*lus 2 c++

在以下代码中:

if ( cin >> x ) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

标准库定义了一个操作符转换操作符void*,它将类型istream转换为void*.但是,如果if测试一个条件,为什么标准库没有定义从类型istream到类型bool的转换?或者实施背后是否有任何隐含的考虑?

Die*_*ühl 8

原因很简单,你不想意外地以转换为int.例如,假设有一个隐式转换bool,你写了

if (std::cin << x) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

编译器无法捕获明显的错误(使用<<而不是>>),因为隐式转换将转换为int并愉快地移动结果.这几乎肯定不是预期的.A void*不能移位,即编译器会产生错误.

在C++ 11之前,没有办法标记转换运算符explicit.您只能将转换构造函数标记为explicit.在C++ 11中,流的转换运算符实际上已更改为explicit转换bool为转换为void*也存在一些问题.