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.2static_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/