鉴于类型A
的定义:
struct A { int i; };
根据规范 [expr.ref] (我使用 n4618 ):
(如果
E2
不是引用,)...如果E1
是左值,则E1.E2
是左值;否则E1.E2
是 xvalue ...
显然A{}.i
是xvalue;
还给出了 [dcl.type.simple] :
(对于
decltype(e)
,) - ...如果e
是未加密的 id-expression或未加密的类成员访问权限。 。 - 否则,如果e
是 xvalue ,则decltype(e)是 T&& ,其中T是类型e
因此,decltype( ( A{}.i ) )
将产生 int&& 。
但是我尝试了GCC5.1和Clang3.9,它们产生了 int ,而vs2015u3产生了 int&& 。哪个是对的?