我有一个接受 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;
}
};