2

这是关于 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;
}
4

1 回答 1

3

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

所以,A x(A());确实是一个函数声明,它以一个类型的函数指针A()作为参数,返回类型是A.

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

A x((A()));

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

于 2015-09-06T10:56:41.953 回答