为什么我不能在c ++中将函数求值作为构造函数参数传递?

时间:2014-02-07 00:34:09

标签: c++ constructor

我想知道为什么我不能将函数评估作为构造函数参数传递,即:

A a(fstream(argv[1]))

如果我尝试拨打a.dump(),我会收到错误消息。

如果我使用

fsrteam fin(argv[1]);
A a(fin);

这很好用。

构造函数声明为

A(std::fstream &file)

1 个答案:

答案 0 :(得分:6)

您必须按如下方式声明a():

A a(std::fstream &out);

此函数a()接受对 mutable (非const)std :: fstream的引用。但是,你的代码:

A a(fstream(argv[1]));

构造一个临时 std :: fstream作为表达式的一部分,该表达式是对()的函数调用。 C ++不允许将临时对象用作采用非const引用的函数的参数。

此规则的基本原理是引用的非常量意味着函数想要更改引用的对象。以这种方式构造的临时的任何更改都会“丢失”,因为当临时对象被销毁时它们会被丢弃,因为函数调用表达式已完成。因此,这种情况通常是一个逻辑错误,该规则旨在“失败安全”并且不允许它。

在第二种情况下,fin变量不是临时变量,因此规则不适用。