【问题标题】:Moving a class derived from istream移动从 istream 派生的类
【发布时间】:2017-01-16 14:21:15
【问题描述】:

我正在使用自定义 streambuf 创建 C++ istream。尝试移动它失败,因为 istream 移动构造函数受到保护。为了解决这个问题,我从istream 派生了一个类:

struct VectorCharBuf : public streambuf {
    VectorCharBuf(vector<char>& v) {
        setg(v.data(), v.data(), v.data() + v.size());
    }
};

struct IVectorCharStream : public istream {
    IVectorCharStream(VectorCharBuf* contents_buf) : istream(contents_buf) {}
};

这个类的默认移动构造函数没有生成,因为它涉及到

使用已删除的函数 'std::basic_ios<_chart _traits>::basic_ios(const std::basic_ios<_chart _traits>&) [with _CharT = char; _Traits = std::char_traits]'

此外,如果我尝试显式声明移动构造函数,如

struct MyIStream : public istream {
    MyIStream(MyIStream&& str) : istream(move(str)) {}
};

我收到“无效使用无效表达式”错误。 (在最后一种情况下,我可能在做一些愚蠢的事情,但我无法发现它......。)

如何创建可移动的istream

【问题讨论】:

  • 你为什么首先尝试移动一个实际的std::istream?这听起来没什么用。
  • @BaummitAugen,所以你可以使用auto variable = MyIstream{};来初始化它?
  • 那你打算怎么处理variablestd::istream 只是一个通用的基础,它本身实际上并没有做任何有用的事情。
  • @BaummitAugen:如果您提供自定义 streambuf,std::istream 很有用。不过,我很高兴能够移动源自istream 的流。
  • 啊,我明白了。那就继续吧。

标签: c++ c++11 move istream


【解决方案1】:
struct MyIStream : public istream {
    MyIStream(MyIStream&& str) : istream(move(str)) {}
};

我收到“无效使用无效表达式”错误。

这不起作用,因为basic_iosistream 的基类包含成员函数void move(basic_ios&amp; _Other)(用于移动基类)。

如果你在构造函数中使用std::move(str),它会编译!

【讨论】:

  • 根据标准,std::istream move 构造函数不会移动streambuf(这就是它首先受到保护的原因),所以这个例子不会在移动时擦除streambuf吗?还是我误会了什么?
【解决方案2】:

如何创建可移动的 istream?

您可以根据基类的默认构造函数来实现类,而不是基类的移动构造函数:

struct MyIStream : public istream {
    MyIStream(MyIStream&& str)
   : istream()
   {
       // todo: implement move functionality from str
   }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2016-10-06
    • 2020-07-13
    • 1970-01-01
    • 2018-06-28
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多