为什么这个Github项目将字符串转换为bool?

时间:2017-05-04 06:34:17

标签: c++ type-conversion implicit-conversion

这是Github上非常流行的生物信息学C ++项目:

  

https://github.com/jts/sga/blob/master/src/Util/ClusterReader.cpp

有一句话:

bool good = getline(*m_pReader, line);

我无法编译这一行,我不知道为什么作者会这样做。

根据documentationgetline返回的字符串不是bool。实际上,这是我在尝试编译项目时得到的结果:

ClusterReader.cpp: In member function ‘bool 
ClusterReader::readCluster(ClusterRecord&)’:
ClusterReader.cpp:70:41: error: cannot convert ‘std::basic_istream<char>’ to ‘bool’ in initialization
 bool good = getline(*m_pReader, line);

为什么C ++代码将字符串转换为bool?怎么可能?

2 个答案:

答案 0 :(得分:3)

std::getline不会返回std::string,而是std::basic_istream。对于getline(*m_pReader, line);,它只返回*m_pReader

std::basic_istream可以通过std::basic_ios::operator bool隐式转换为bool(自C ++ 11起),

  

如果流没有错误并且已准备好进行I / O操作,则返回true。具体来说,返回!fail()

在C ++ 11之前,它可以隐式转换为void*,也可以转换为bool

您的编译器似乎无法执行隐式转换,您可以使用!fail()作为解决方法,例如

bool good = !getline(*m_pReader, line).fail();

答案 1 :(得分:2)

请参阅此question

用户 Loki Astari 在他的回答中写道:

  

getline()实际上返回对其使用的流的引用。   当流在布尔上下文中使用时,它将转换为a   可以在布尔上下文中使用的未指定类型(C ++ 03)。在   C ++ 11已更新并转换为bool。

这意味着您可能不使用最新的编译器(C ++ 03甚至更好的C ++ 11)。如果您使用g++gcc,请尝试在命令中添加-std=c++11