istream bool转换:什么时候可用?

时间:2014-04-29 12:24:53

标签: c++ gcc c++11 type-conversion clang

这个简单的代码

bool foo(std::istringstream&stream, std::string&single, char del)
{ return std::getline(stream,single,del); }

使用gcc(4.8.2)进行编译,但不使用clang(3.4,使用libc ++)进行编译,这会导致无法从std::basic_istream<char, std::char_traits<char> >转换为bool。但是,当我将参数包装到static_cast<bool>()中的return语句时,clang很高兴。

这使我感到困惑让我想知道上面的代码是否形成良好,即gcc或clang是否正确。根据{{​​3}} std::getline返回std::basic_istream<char, std::char_traits<char> >,它继承自std::basic_ios,其类型转换为operator bool(自C ++ 11之前,之前)类型转换为void*)。不应该自动选择此转换运算符吗? (出于某种原因,我更愿意接受gcc错误而不是clang)。

编辑我刚才发现显然llvm的libc ++声明了问题explicit中的转换运算符,认为它对隐式转换无效。这符合标准吗?

2 个答案:

答案 0 :(得分:5)

铿锵是对的。从C ++ 11开始,std::basic_iosbool的转换确实需要explicit

C ++ 11,[ios.overview]

explicit operator bool() const;

答案 1 :(得分:1)

由于函数返回中发生的初始化是复制初始化,因此可能不会隐式应用显式转换operator bool。 来自C ++标准

  

2转换函数可以是显式的(7.1.2),在这种情况下它是   仅被视为用户定义的直接初始化转换   (8.5)。

所以GCC有一个错误。

当使用直接初始化时,或者在特殊上下文中,可以隐式应用运算符作为if条件的上下文。