C++ istream到bool转换:何时可用?

C++ istream到bool转换:何时可用?,c++,gcc,c++11,type-conversion,clang,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++),clang抱怨没有从std::basic_istream到bool的可行转换。但是,当我将参数包装到static_cast()中的return语句时,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++),clang抱怨没有从
std::basic_istream
bool
的可行转换。但是,当我将参数包装到
static_cast()
中的return语句时,clang很高兴

这让我感到困惑,我想知道上面的代码是否格式正确,即gcc或clang是否正确。根据
std::getline
返回一个
std::basic_istream
,它继承自一个
std::basic_ios
,该ios具有类型转换
运算符bool
(从C++11开始,在它是到
void*
的类型转换之前)。是否应该自动选择此转换运算符?(出于某种原因,我更愿意接受gcc是错误的,而不是clang)


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

叮当声是正确的。自C++11以来,从
std::basic_ios
bool
的转换确实需要
explicit

C++11,
[ios.overview]

explicit operator bool() const;

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

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

所以GCC有一个bug


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

显式运算符bool()
表示
基本ios
对象不允许隐式转换为
bool
,gcc允许的相反情况。我认为clang就在这里。@0x499602D2如果你能引用标准的话,我会接受相应的答案…@Walter你为什么不从wg21网站下载一些随机的标准草案,转到关于输入/输出的章节,找到基本ios的定义,亲自查看操作员面前是否有
明确的
?这会比问一个问题花费更少的时间,所以。。。Marc Glisse也这样说:因为通过在StAcExver上提问,他能够创建一个容易访问的在线参考答案,这个问题使我无法构建一个非常大的C++代码库(ITK)。我不是一个C++程序员,当然也不知道从哪里看ANSI标准。谢谢,沃尔特!