(简单构造函数概念)为什么不Foo(); 做任何事情?

Jas*_*son 5 c++ constructor copy-constructor default-constructor

这是一个简单的C++构造函数概念,我遇到了麻烦.

鉴于此代码段:

#include <iostream>
using namespace std;

class Foo 
{
public:
    Foo ()      {       cout << "Foo()"  << endl;     }
    ~Foo ()     {       cout << "~Foo()" << endl;     }
};

int main()
{
    Foo f1;
    Foo f2();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Foo()
~Foo()
Run Code Online (Sandbox Code Playgroud)

好像Foo f2();什么也没做.什么 Foo f2();为什么没有做任何事情?

Pra*_*rav 9

Foo f2();声明一个名为的函数f2,该函数不带参数并返回一个类型的对象Foo

还要考虑一个内部也有复制构造函数的情况 Foo

Foo (const Foo& obj)     
{     
     cout << "Copy c-tor Foo()"  << endl;    
} 
Run Code Online (Sandbox Code Playgroud)

如果您尝试写作Foo obj(Foo()),在这种情况下,您可能会期望调用复制c-tor,这是不正确的.

在这种情况下,obj将被解析为返回Foo对象并将类型指针的参数转换为函数的函数.这也被称为Most Vexing Parse.

正如其中一条评论中所提到的那样Foo obj((Foo()));,编译器会将其解析为表达式(即将其解释为对象)而不是函数,因为它是额外的().

  • 可能会提到`Foo obj((Foo()))`,会使编译器将其解释为对象而不是函数. (3认同)