相关疑难解决方法(0)

是`f().a [0]`xvalue?

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++

15
推荐指数
1
解决办法
699
查看次数

标签 统计

c++ ×1