移动包含文件流的对象
C++11 - Move object containing filestream
我有以下(简化的问题):
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)。
-
Stream
类需要有一个复制构造函数,如果我这样做,虽然它没有使用。 - 我不能移动
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);
}
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在h文件中包含.o对象文件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 检测 COFF 对象文件中C++内联符号
- 特定对象文件的单线程生成
- 使用对象文件读取三角形数据网格
- 链接时,不同静态库中的同一对象文件
- 防止临时对象文件访问 MSVC 中的磁盘
- 对在不同二进制文件中创建的对象文件的依赖关系
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 使用 make 将对象文件放在特定目录中
- 如何从 3d 对象文件中获取 3d 坐标
- 为什么我的生成文件没有生成对象文件?
- 如何在OSX上正确创建C++对象文件(.o)
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 使用nvcc(CUDA-RINSIDE)正确链接对象文件
- 链接节点本机模块中的提升库,对象文件需要替代库版本