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

Dav*_*ran 4 c++ ternary-operator

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

class Stream
{
    public:
    Stream(std::istream &is) : s_ {is.good() ? is : throw std::runtime_error {"Invalid input stream\n"}} 
        {}

    private:
    std::istream &s_;
};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨的构造函数std::basic_istream(const basic_istream &)被删除(可以理解,因为您不能复制流)。但是,我看不到在这里进行任何复制吗?它必须在三元运算符中,因为

Stream(std::istream &is) : s {is} {}
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*tin 9

GCC错误64372

条件运算符上的cppreference ,我们了解到,如果条件运算符的一个操作数是throw表达式,则“条件运算符的结果具有另一个表达式的类型和值类别”。因此,您对条件运算符的使用应导致的类型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 stream\n"};
        return is;
    }
};
Run Code Online (Sandbox Code Playgroud)