在类中使用ofstream rvalue来写文件

时间:2015-02-18 23:50:24

标签: c++ c++11 stream

我想编写简单的类来编写csv文件。传递/使用ofstream时遇到问题。我希望上课有两个承包商。一个采取字符串和制作ofstream,第二次采取ofstream作为参数。

这是测试代码,我现在用它来了解发生了什么,但不能:

class Test {
public:

  Test (const string & s):of {move(ofstream(s))} {}
  Test (ofstream && s):of {move(s)} {}

  ~Test() {of.close();}

  void write(const string & s) {
    of << s << endl;
  }


private:
  ofstream && of;
};


int main()
{


  // case 1
  Test t(ofstream{"/tmp/test2.csv"});
  t.write("SDFSDF");
  t.write("SDFSDF");

  // case 2
  Test t2("/tmp/test3.csv");
  t2.write("SDFSDF");
  t2.write("SDFSDF");


  //case 3
  ofstream ofs("/tmp/test4.csv");
  Test t3(move(ofs));
  t3.write("SDFSDF");
  t3.write("SDFSDF");

   return 0;
}

代码编译并执行。但在案例1和2中,结果文件为空。在第三种情况下,根本不会创建任何文件。为什么?怎么了?也许我以错误的方式使用右值引用?如果是这样,我应该如何使用它们?或者也许有更好的方法来实现我想要实现的目标并且不需要rvalues?

1 个答案:

答案 0 :(得分:1)

在第一个构造函数中,初始化ofstream。然后&#34;移动&#34;应用于它,它只在编译期间将返回类型更改为r值引用。然后该引用用于初始化另一个引用&#34;&#34;。然后实例被销毁。 &#34;写&#34;尝试写入一个被破坏的对象,这会导致错误。

R值引用仍然是引用,将其视为指针。我想你应该宣布&#34;&#34;如上游。