这个简单的代码
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
中的转换运算符,认为它对隐式转换无效。这符合标准吗?
答案 0 :(得分:5)
铿锵是对的。从C ++ 11开始,std::basic_ios
到bool
的转换确实需要explicit
。
C ++ 11,[ios.overview]
:
explicit operator bool() const;
答案 1 :(得分:1)
由于函数返回中发生的初始化是复制初始化,因此可能不会隐式应用显式转换operator bool
。
来自C ++标准
2转换函数可以是显式的(7.1.2),在这种情况下它是 仅被视为用户定义的直接初始化转换 (8.5)。
所以GCC有一个错误。
当使用直接初始化时,或者在特殊上下文中,可以隐式应用运算符作为if条件的上下文。