#include <fstream>
#include <iostream>
class Bar { };
class Foo {
public:
Foo(Bar&) { }
};
int main()
{
Foo bar(Bar());
}
Bar()返回什么,为什么这段代码会编译?
答案 0 :(得分:1)
Bar()
返回的实际并不重要,因为它实际上什么也没做!声明
Foo bar(Bar());
是一个函数声明,声明函数bar
返回Foo
并且接受一个不带参数的函数并返回Bar
作为参数。这种声明称为Most Vexing Parse。
假设声明写成
Foo bar{Bar()};
表达式Bar()
将通过调用Bar
的默认构造函数来创建类型为Bar
的临时对象。当然,代码无法编译,因为您无法将Bar()
生成的临时绑定到非const
左值引用,这是Foo
的构造函数所期望的。