我想编写简单的类来编写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?
答案 0 :(得分:1)
在第一个构造函数中,初始化ofstream。然后&#34;移动&#34;应用于它,它只在编译期间将返回类型更改为r值引用。然后该引用用于初始化另一个引用&#34;&#34;。然后实例被销毁。 &#34;写&#34;尝试写入一个被破坏的对象,这会导致错误。
R值引用仍然是引用,将其视为指针。我想你应该宣布&#34;&#34;如上游。