答案 0 :(得分:7)
您应该添加您编译的语言标准和编译器。
在C ++ 11之前,std::basic_ios
有operator void*
,因为C ++ 11改为explicit operator bool
。
第二个是显式的,意味着像你的例子中的隐式转换不能使用它。
来自GNU项目的libstdc ++仍然无条件地包含了前C ++转换(版本4.9.1):operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
自2014-09-24以来,错误https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56193已解决 - 已修复,因此应更正下一版本。
答案 1 :(得分:0)
根据C ++标准(13.3.1.5转换函数初始化,第1页)
考虑S及其基类的转换函数。 那些未在S中隐藏的非显式转换函数 和yield类型T或可以通过a转换为类型T的类型 标准转换序列(13.3.3.1.1)是候选函数。对于 直接初始化,那些显式转换函数 未隐藏在S和yield类型T或可转换的类型中 用资格转换(4.4)输入T也是候选人 功能
班级std::basic_ios
有明确的转化函数operator bool
。如
这个宣言
bool b = std::cin;
不使用直接初始化(有复制初始化)那么它似乎是编译器的一个bug,即声明不会被编译。