gpt4 book ai didi

C++11 - move 包含文件流的对象

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:34 25 4
gpt4 key购买 nike

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

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. 我无法 move fstream

这是编译器问题还是我遗漏了一些基本的东西?

最佳答案

根据cppreference.com.function :

template< class F > 
function( F f );

The type F should be CopyConstructible and the object f should be Callable.

但是您的 Stream 类的复制构造函数被删除:

Stream(const Stream & rhs) = delete;

I can't move the fstream

这是 libstdc++ 库的一个已知问题。以下代码使用 clang 和 libc++ 编译良好:

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

但是 libstdc++ 失败了。

关于C++11 - move 包含文件流的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16911533/

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