无法使用三元运算符有条件地分配"istream &"?



我有一个接受 std::istream &的构造函数并在分配一个成员之前对其进行检查( std::istream &(。例如:

class Stream
{
    public:
    Stream(std::istream &is) : s_ {is.good() ? is : throw std::runtime_error {"Invalid input streamn"}} 
        {}
    private:
    std::istream &s_;
};

编译器抱怨删除了std::basic_istream(const basic_istream &)的构造函数(可以理解,因为您无法复制流(。但是,我看不到这里的任何复制在哪里?它必须在三元操作员内,因为

Stream(std::istream &is) : s {is} {}

没有检查就可以了。std::istream试图复制在哪里?我该如何解决?

此GCC错误64372。

从条件运算符上的cppReference中,我们了解到,如果条件运算符的操作数是投掷表达式,"条件运算符的结果具有其他表达式的类型和值类别"。因此,您对条件操作员的使用应导致一种std::istream&,但GCC认为是std::istream


要解决此GCC错误,请使用助手功能:

class Stream
{
    public:
    Stream(std::istream &is) : s_ {validated_stream(is)} 
        {}
    private:
    std::istream &s_;
    static std::istream &validated_stream(std::istream &is) {
        if (!is.good()) throw std::runtime_error {"Invalid input streamn"};
        return is;
    }
};

最新更新