移动是否分配了 std::fstream 关闭原始流

Does move assign an std::fstream close the original stream

本文关键字:原始 fstream 移动 分配 std 是否      更新时间:2023-10-16

从 c++11 开始,我们可以将分配一个std::fstream对象移动到另一个对象,但我找不到说明如果fstream对象已经与文件关联会发生什么的文档(is_open()==true )。

所以我的问题是,在下面的代码中,File1.txt是否会正确关闭,或者我是否必须手动关闭它。如果我必须手动执行此操作,如果我不这样做会发生什么?

std::fstream file("File1.txt");   
file = std::fstream("File2.txt"); //will this implicitly call file.close()?             

fstream对象的移动赋值将导致其关联filebuf的移动赋值。 该文档非常清楚地表明,首先关闭旧文件(好像file.rdbuf()->close()不是file.close()):

basic_filebuf& operator=(basic_filebuf&& rhs);

  1. 效果:调用this->close()然后从rhs中移动分配。在移动分配之后,*this具有从rhs构造的移动时将具有的可观察状态。
  2. 返回: *this .

basic_fstream& operator=(basic_fstream&& rhs);

  1. 效果:移动从基*this和相应的成员中分配基rhs
  2. 返回: *this .

(这是n4527草案中的措辞,至少自n3485以来保持不变)

由于实际的文件相关机制"隐藏"在相应的缓冲区中(流实际上主要提供格式化 IO),因此您应该查看std::basic_filebuf文档:

首先调用 close() 关闭关联的文件,然后移动 RHS 的内容 *这:放置和获取缓冲区,相关的 文件、区域设置、打开模式、is_open标志和任何其他状态。 移动后,rhs 不与文件关联,rhs.is_open() == 假。

从 http://en.cppreference.com/w/cpp/io/basic_filebuf/operator%3D 复制