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
Run Code Online (Sandbox Code Playgroud)
5.7表达式是xvalue,如果它是:
(7.1) - 调用函数的结果,无论是隐式还是显式,其返回类型是对象类型的右值引用,
(7.2) - 对对象类型的右值引用的强制转换,
(7.3) - 一个类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue,或者
(7.4) - a.*指向成员的表达式,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针.
5.2.1订阅后缀表达式后跟方括号中的表达式是后缀表达式.其中一个表达式的类型为"array of
T"或"指向T",另一个表达式应具有未映射的枚举或整数类型.结果是"T" 类型.类型"T"应该是完全定义的对象类型.表达式E1[E2](根据定义)与*((E1)+(E2))<<*t[注意:有关数组的详细信息,请参见5.3和5.7*以及+和8.3.4的详细信息).-end note],除了在数组操作数的情况下,如果该操作数是左值,则结果为左值,否则为x值.
那么,是f().a[0] …
c++ ×1