Aut*_*hre 3 c++ most-vexing-parse
我读到这段代码A a( A() );
被编译器解释为函数声明,而在这里我清楚地看到这A()
是一个返回对象的函数。建造一个A
对象怎么可能是别的东西呢?
我刚刚完整阅读了 cppreference 的函数声明页面:https://en.cppreference.com/w/cpp/language/function,但我没有看到参数列表看起来像这样的任何地方A()
。
我不明白最令人烦恼的解析如何可以是有效的 C++。
A()
本身不是函数声明,但它可以是函数的类型。
例如,假设我声明以下函数:A makeAnA();
。的类型makeAnA
是A()
: 不带参数并返回 的函数A
。
引用函数上的 cppreference :
每个函数都有一个类型,它由函数的返回类型、所有参数的类型(在数组到指针和函数到指针转换之后,参见参数列表)、函数是否为
noexcept
(C++ 起) 17),对于非静态成员函数,cv 限定和 ref 限定 (C++11 起)。函数类型也具有语言链接。
因此,具有零个参数的函数返回一个A
,但不noexcept
具有类型A()
。
因此,可以将其解释A a( A() );
为函数声明。它声明a
接受一个类型为 的单个未命名参数A()
,并返回 anA
作为其结果。因为可以将其解释为函数声明,所以标准要求如此解释。