如何比较两个std :: istream引用?

时间:2013-09-18 09:07:44

标签: c++ gcc c++11 clang iostream

我正在将编译器从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))
 ~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果这是一个愚蠢的问题,我会事先道歉;我很欣赏任何指示。

1 个答案:

答案 0 :(得分:7)

您正在使用引用,因此您正在比较对象而不是指针。似乎GCC有一个扩展,允许您比较std::istream个对象,但这不是std::basic_istream标准化接口的一部分。尝试:

_sCheck(&is != &std::cin)