为什么不为语句“A x(A())”调用A的构造函数?

时间:2015-09-06 10:48:07

标签: c++ c++11 most-vexing-parse

这是一个关于C ++的基本问题。为什么不为语句“A x(A())”调用构造函数?

在下面的代码中 - 我用g ++ 4.8.2运行 - 构造函数(以及析构函数)只被调用一次。这可能是由于优化,但我很想知道x的类型 - 由typeid报告 - 这是“A(A(*)())”。

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

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

int main() {
   int status;

   A x(A());
   cout << abi::__cxa_demangle(typeid(x).name(),0,0,&status) << endl;

   A a ;
   cout << abi::__cxa_demangle(typeid(a).name(),0,0,&status) << endl;

   return 0;
}

1 个答案:

答案 0 :(得分:3)

它通常被称为c ++ vexing parse,这意味着几乎所有可以被解析为函数声明的东西都会。

因此,A x(A());确实是一个函数声明,它将A()类型的函数指针作为其参数,返回类型为A

您可以添加一对括号以强制编译器将其作为变量初始化进行处理:

A x((A()));

因为用括号括起形式参数声明是不合法的,但用括号括起函数调用的参数是合法的,所以通过添加一对括号,我们强制编译器查看我们的事情方式。