将流转换为bool并不适用于另一个编译器

时间:2014-10-10 17:30:39

标签: c++

为什么libstdc++有效,但libc++失败了?在gcc上它也有效:

bool b = std::cin;

2 个答案:

答案 0 :(得分:7)

您应该添加您编译的语言标准和编译器。

在C ++ 11之前,std::basic_iosoperator 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,即声明不会被编译。