MWi*_*Wid 5 c++ types expression reference c++11
这是一个语言律师问题。C++11 中的第 5p5 条内容如下:
\n\n\n\n\n如果表达式最初具有类型 \xe2\x80\x9creference to T\xe2\x80\x9d (8.3.2, 8.5.3),则在任何进一步分析之前将类型调整为 T。表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。
\n
另一方面,\xc2\xa75.2.2p3 指出:
\n\n\n\n\n如果后缀表达式指定析构函数 (12.4),则函数调用表达式的类型为 void;\n 否则,函数调用表达式的类型为静态选择的函数的返回类型(即,\n 忽略虚函数)关键字),即使实际调用的函数的类型不同。该类型应为对象类型、引用类型或 void 类型。
\n
考虑这段代码:
\n\nint& f();\nf(); // What is the type of this expression?\n
Run Code Online (Sandbox Code Playgroud)\n
的类型f()
是int
; 它的值类别是左值。你可以证明这个事实:
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
。