函数调用表达式的类型是什么?

MWi*_*Wid 5 c++ types expression reference c++11

这是一个语言律师问题。C++11 中的第 5p5 条内容如下:

\n\n
\n

如果表达式最初具有类型 \xe2\x80\x9creference to T\xe2\x80\x9d (8.3.2, 8.5.3),则在任何进一步分析之前将类型调整为 T。表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。

\n
\n\n

另一方面,\xc2\xa75.2.2p3 指出:

\n\n
\n

如果后缀表达式指定析构函数 (12.4),则函数调用表达式的类型为 void;\n 否则,函数调用表达式的类型为静态选择的函数的返回类型(即,\n 忽略虚函数)关键字),即使实际调用的函数的类型不同。该类型应为对象类型、引用类型或 void 类型。

\n
\n\n

考虑这段代码:

\n\n
int& f();\nf();  // What is the type of this expression?\n
Run Code Online (Sandbox Code Playgroud)\n

Cas*_*sey 0

的类型f()int; 它的值类别是左值。你可以证明这个事实:

\n\n
int& f();\nstatic_assert(std::is_same<int&,decltype((f()))>::value,"EXPLODE");\n
Run Code Online (Sandbox Code Playgroud)\n\n

按照 C++11 \xc2\xa77.1.6.2 [dcl.type.simple]/4 "...ife是左值,decltype(e)则 是T&,其中T是 " 的类型e

\n