move是否指定std :: fstream关闭原始流

时间:2016-02-01 20:24:58

标签: c++ filestream move

从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()?             

2 个答案:

答案 0 :(得分:7)

fstream对象的移动分配将导致其关联的filebuf的移动分配。该文档清楚地表明旧文件首先被关闭(如果file.rdbuf()->close()不是file.close()):

  

<强> basic_filebuf& operator=(basic_filebuf&& rhs);

     
      
  1. 效果:调用this->close()然后从rhs移动分配。在移动作业*this具有可观察状态之后,如果它是从rhs移动构建的话,它将具有可观察状态。
  2.   
  3. 返回:*this
  4.         

    <强> basic_fstream& operator=(basic_fstream&& rhs);

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

(这是n4527草案中的措辞,至少从n3485起未改变)

答案 1 :(得分:4)

由于实际的文件相关机器被隐藏了#39在相应的缓冲区内(流实际上主要提供格式化IO),您应该查看std::basic_filebuf文档:

  

首先调用close()来关闭相关文件,然后移动   rhs的内容进入* this:put和get buffer,关联   file,locale,openmode,is_open标志和任何其他状态。   移动后,rhs不与文件关联,rhs.is_open()==   假的。

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

复制