【发布时间】:2019-08-01 18:30:32
【问题描述】:
我有一个接受std::istream & 的构造函数,并在分配其中一个成员(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_;
};
编译器抱怨std::basic_istream(const basic_istream &) 的构造函数被删除(可以理解,因为你不能复制流)。但是,我看不到这里在哪里进行了复制?它必须在三元运算符内,因为
Stream(std::istream &is) : s {is} {}
没有检查工作正常。 std::istream 试图被复制到哪里?我该如何解决这个问题?
【问题讨论】:
-
编译器无法判断通用类型。
-
我很确定问题出在
throw,而不是三元运算符。 -
@VladfromMoscow 应该是,不过,
throw表达式是void,?:有专门的措辞来处理它。 -
添加接受
istream&并返回istream&的辅助方法,在里面你可以检查good调用,如果失败抛出异常。s_{testMethod(is)}. -
@rafix07 这是否意味着我的构造函数必须捕获该异常并抛出它? (例如)如果调用者想要处理它?
标签: c++ ternary-operator