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尝试复制到哪里?我该如何解决呢?
从条件运算符上的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)