移动包含文件流的对象

C++11 - Move object containing filestream

本文关键字:对象 文件 包含 移动      更新时间:2023-10-16

我有以下(简化的问题):

class Stream()
{ 
    std::ofstream mStr;
public:
    Stream() : mStr("file", ofstream::out)
    {}
    Stream(const Stream & rhs) = delete;
    Stream(Stream && rhs) : mStr(move(rhs.mStr))
    {}
    void operator()(string& data)
    {
        mStr << data;
    }
    ~Stream() = default;
};

该对象用于记录目的(测量数据),并且只会使用很短的时间,因此只要它是活的,它就是打开的。现在的主要思想是这样使用它:

int main()
{
    std::function<void (std::string&)> Logger = Stream();
    for (std::string& data : DataList)
    {
        Logger(data);
    }
}

我有两个问题(GCC 4.7.2)。

  1. Stream类需要有一个复制构造函数,如果我这样做,虽然它没有使用。
  2. 我不能移动fstream

这是一个编译器问题,还是我在这里错过了一些基本的东西?

根据cppreference.com.function:

template< class F > 
function( F f );

类型F应为CopyConstructible,对象f应为Callable

但是Stream类的复制构造函数是deleted:

Stream(const Stream & rhs) = delete;

我不能移动fstream

这是libstdc++库的已知问题。下面的代码在clang和libc++下可以很好地编译:

std::fstream f1, f2;
f2 = std::move(f1);

libstdc++失败

作为一种解决方法,您可以使用lambda函数:

Stream s;
auto Logger = [&s] (std::string& data) {
    s(data);
};
for (std::string& data : DataList) {
    Logger(data);
}