-1
#include <fstream>
#include <iostream>
class Bar { };
class Foo {
public:
Foo(Bar&) { }
};
int main()
{
Foo bar(Bar());
}
Bar()返回什么?为什么这个代码会编译?将构造函数的返回值作为参数传递
#include <fstream>
#include <iostream>
class Bar { };
class Foo {
public:
Foo(Bar&) { }
};
int main()
{
Foo bar(Bar());
}
Bar()返回什么?为什么这个代码会编译?将构造函数的返回值作为参数传递
它实际上并不重要什么Bar()
返回,因为它实际上什么都不做!声明
是一个函数声明,宣布它返回一个Foo
和接受一个函数采取任何参数,并返回一个Bar
作为参数的函数bar
。这种声明被称为Most Vexing Parse。
假设语句被写成如
Foo bar{Bar()};
表达Bar()
将通过调用Bar
的默认构造函数创建Bar
类型的临时对象。当然,代码不会编译,因为您不能将由Bar()
生成的临时文件绑定到const
左值引用,这是Foo
的构造函数所期望的。
我用Foo bar {Bar( )};在Visual Studio 2014中,它编译得很好。这是视觉工作室的错? – 2014-10-28 23:18:32
“为什么要编译?”改变'main'为'Foo bar((Bar()));'看到你想要的行为代码不能编译:-) – dasblinkenlight 2014-10-28 22:35:54