struct S{
    int a[3] = {1,2,3};
};

S&& f(){return S();}

&f().a;       //[Error] taking address of xvalue (rvalue reference)
&f().a[0];    //ok in GCC 5.1.0 and Clang 3.6.0

S s;
&static_cast<S&&>(s).a;     //[Error] taking address of xvalue (rvalue reference)
&static_cast<S&&>(s).a[0];  //ok in GCC 5.1.0 and Clang 3.6.0



那么,f().a[0]是一个xvalue吗?

我认为f().a[0]应该是一个xvalue。

[Edit1]

忽略&f().a;&f().a[0];,因为12.2 [class.temporary] p5.2


static_cast<S&&>(s).a是一个xvalue(7.2和7.3)。

“,除了在数组操作数的情况下,如果该操作数是左值则结果是左值,否则是xvalue。”

所以我认为static_cast<S&&>(s).a[0]应该是一个xvalue,但是
&static_cast<S&&>(s).a[0]; //ok in GCC 5.1.0 and Clang 3.6.0
追问:

我错了吗?如果我写错了,请给我看一个示例,对数组进行下标会得到一个xvalue。

最佳答案

据我所知,您确实是正确的,这看起来像是一个“错误”,尽管公平地说,最近CWG defect 1213对此进行了更改,其中说:



并将第5.2.1节[expr.sub]更改如下:



因此,确实f().a[0];static_cast<S&&>(s).a[0]的结果应该是xvalues。

直到2012年12月,该缺陷才提出解决方案,clangs defect report support列出了对该缺陷报告的支持,因为未知,因此实现者很可能还没有解决此缺陷。

更新资料

提交了一个lang语bug report: Subscript operator applied to an temporary array results in an lvalue

关于c++ - `f().a[0]`是xvalue吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31206988/

10-10 10:10