在这个例子中,C++ 最令人烦恼的解析是如何实现的?

Aut*_*hre 3 c++ most-vexing-parse

我读到这段代码A a( A() );被编译器解释为函数声明,而在这里我清楚地看到这A()是一个返回对象的函数。建造一个A对象怎么可能是别的东西呢?

我刚刚完整阅读了 cppreference 的函数声明页面:https://en.cppreference.com/w/cpp/language/function,但我没有看到参数列表看起来像这样的任何地方A()

我不明白最令人烦恼的解析如何可以是有效的 C++。

Nat*_*son 6

A()本身不是函数声明,但它可以是函数的类型。

例如,假设我声明以下函数:A makeAnA();。的类型makeAnAA(): 不带参数并返回 的函数A

引用函数上的 cppreference :

每个函数都有一个类型,它由函数的返回类型、所有参数的类型(在数组到指针和函数到指针转换之后,参见参数列表)、函数是否为noexcept(C++ 起) 17),对于非静态成员函数,cv 限定和 ref 限定 (C++11 起)。函数类型也具有语言链接。

因此,具有零个参数的函数返回一个A,但不noexcept具有类型A()

因此,可以将其解释A a( A() );为函数声明。它声明a接受一个类型为 的单个未命名参数A(),并返回 anA作为其结果。因为可以其解释为函数声明,所以标准要求如此解释。