我想知道为什么我不能将函数评估作为构造函数参数传递,即:
A a(fstream(argv[1]))
如果我尝试拨打a.dump()
,我会收到错误消息。
如果我使用
fsrteam fin(argv[1]);
A a(fin);
这很好用。
构造函数声明为
A(std::fstream &file)
答案 0 :(得分:6)
您必须按如下方式声明a():
A a(std::fstream &out);
此函数a()接受对 mutable (非const)std :: fstream的引用。但是,你的代码:
A a(fstream(argv[1]));
构造一个临时 std :: fstream作为表达式的一部分,该表达式是对()的函数调用。 C ++不允许将临时对象用作采用非const引用的函数的参数。
此规则的基本原理是引用的非常量意味着函数想要更改引用的对象。以这种方式构造的临时的任何更改都会“丢失”,因为当临时对象被销毁时它们会被丢弃,因为函数调用表达式已完成。因此,这种情况通常是一个逻辑错误,该规则旨在“失败安全”并且不允许它。
在第二种情况下,fin变量不是临时变量,因此规则不适用。