我正在将编译器从GCC切换到Clang / LLVM,并遇到以前没有遇到过的编译错误。
我有一个看起来像这样的课程:
#include <iostream>
class foo {
public:
bar(std::istream& is) : _fp(is), _sCheck(is != std::cin) { /* ... */ }
private:
std::istream& _fp;
bool _sCheck;
}
编译此文件时,clang++
出现以下错误,其中私有变量_sCheck
的初始化失败:
error: invalid operands to binary expression ('std::istream' (aka
'basic_istream<char>') and 'istream' (aka 'basic_istream<char>'))
(is != std::cin)
~~ ^ ~~~~~~~~
如果此地址比较中的两个对象属于同一类型,为什么clang++
会返回错误,而g++
则不会?
我尝试了一个dynamic_cast
同时使它们std::istream&
,但这也是一个错误:
error: invalid operands to binary expression ('std::istream' (aka
'basic_istream<char>') and 'std::istream')
(is != dynamic_cast<std::istream&>(std::cin))
~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果这是一个愚蠢的问题,我会事先道歉;我很欣赏任何指示。
答案 0 :(得分:7)
您正在使用引用,因此您正在比较对象而不是指针。似乎GCC有一个扩展,允许您比较std::istream
个对象,但这不是std::basic_istream
标准化接口的一部分。尝试:
_sCheck(&is != &std::cin)