这是一个关于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;
}
答案 0 :(得分:3)
它通常被称为c ++ vexing parse,这意味着几乎所有可以被解析为函数声明的东西都会。
因此,A x(A());
确实是一个函数声明,它将A()
类型的函数指针作为其参数,返回类型为A
。
您可以添加一对括号以强制编译器将其作为变量初始化进行处理:
A x((A()));
因为用括号括起形式参数声明是不合法的,但用括号括起函数调用的参数是合法的,所以通过添加一对括号,我们强制编译器查看我们的事情方式。