gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:59 26 4
gpt4 key购买 nike

我有一个接受 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 在哪里?我该如何解决这个问题?

最佳答案

GCC bug 64372 .

来自 conditional operator 上的 cppreference ,我们了解到如果条件运算符的一个操作数是抛出表达式,“[t] 条件运算符的结果具有另一个表达式的类型和值类别。”因此,您对条件运算符的使用应该导致 std::istream& 类型,但是 GCC thinks it's 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;
}
};

关于c++ - 无法使用三元运算符有条件地分配 `istream &`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com