2014-10-28 148 views
-1
#include <fstream> 
#include <iostream> 

class Bar { }; 

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

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

Bar()返回什么?为什么这个代码会编译?将构造函数的返回值作为参数传递

+0

“为什么要编译?”改变'main'为'Foo bar((Bar()));'看到你想要的行为代码不能编译:-) – dasblinkenlight 2014-10-28 22:35:54

回答

1

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

​​

是一个函数声明,宣布它返回一个Foo和接受一个函数采取任何参数,并返回一个Bar作为参数的函数bar。这种声明被称为Most Vexing Parse

假设语句被写成如

Foo bar{Bar()}; 

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

+0

我用Foo bar {Bar( )};在Visual Studio 2014中,它编译得很好。这是视觉工作室的错? – 2014-10-28 23:18:32

相关问题