decltype的正确结果是什么((A {}。int_member))?

时间:2017-02-04 07:20:21

标签: c++ c++14 language-lawyer c++17

鉴于类型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&& 。哪个是对的?

1 个答案:

答案 0 :(得分:4)

int&&是正确的。

你在[expr.ref]中引用的措辞几年前被cwg 616更改了,并没有被实现立即采用;看到我的回答here。基本上,编译器必须同时采用DR 616和关于临时表达式的论文,或者它们会破坏代码,在这些代码中,对象的生命周期扩展(我们绑定对象的成员的引用)是必需的。在旧的实现模型中,只有prvalues可以指定生命延长可行的对象(尽管Johannes指出的措辞中没有这样的要求,但是在N3918之前它的措辞模糊,所以......)。