将构造函数的返回值作为参数传递

时间:2014-10-28 22:25:40

标签: c++ constructor

#include <fstream>
#include <iostream>

class Bar { };

class Foo {
    public:
    Foo(Bar&) { }
 };

int main()
{
   Foo bar(Bar());
}

Bar()返回什么,为什么这段代码会编译?

1 个答案:

答案 0 :(得分:1)

Bar()返回的实际并不重要,因为它实际上什么也没做!声明

Foo bar(Bar());

是一个函数声明,声明函数bar返回Foo并且接受一个不带参数的函数并返回Bar作为参数。这种声明称为Most Vexing Parse

假设声明写成

Foo bar{Bar()};

表达式Bar()将通过调用Bar的默认构造函数来创建类型为Bar的临时对象。当然,代码无法编译,因为您无法将Bar()生成的临时绑定到非const左值引用,这是Foo的构造函数所期望的。