因此,我阅读这个answer是因为我对值何时被视为xvalue感到困惑,就像某个值在其生命周期结束时/即将结束时一样。可悲的是我仍然很困惑。
不管怎么说,引文中包括:
答案中也包含了一个例子,但它没有举例说明(我猜)“一个.*指针到成员的表达式,其中第一个操作数是x值,第二个操作数是数据成员的指针。”
但是,在执行f().m时,它确实举例说明了“类成员访问表达式指定非引用类型的非静态数据成员,其中对象表达式是xvalue”,而m是xvalue/ rvalue这一事实对我来说是有意义的,因为f()返回rvalue引用。但是a是一个lvalue,那么如果您做了a.m,这不是一个值吗?
这里的混乱之处在于,这个成员访问表达式仍在指定一个非引用类型的非静态数据成员。或者当说“其中的对象表达式是xvalue”时,它是否意味着类对象必须是rvalue?
答案中提到的例子如下:
struct A {
int m;
};
A&& operator+(A, A);
A&& f();
A a;
A&& ar = static_cast<A&&>(a);发布于 2017-06-27 13:15:02
答案中也包含了一个例子,但它没有举例说明(我猜)“一个.*指针到成员的表达式,其中第一个操作数是x值,第二个操作数是数据成员的指针。”
下面是一个例子:
struct C { int m = 42; };
int C::* p = &C::m;
C&& get_xvalue();
std::cout << get_xvalue().*p; // get_xvalue() is an xvalue, p is a pointer to member一种类成员访问表达式,用于指示非引用类型的非静态数据成员,其中对象表达式为xvalue。
这意味着访问非引用类型的非静态数据成员可以有lvalue或xvalue值类别,这取决于对象表达式的值类别(即点.之前的部分)。无论数据成员是引用类型,它都将始终是lvalue。
例如。
struct C {
std::string x;
};
C obj;
std::move(obj.x) // rvalue and xvalue expression
std::move(obj).x // In this case xvalue since `x` is not a reference type. Otherwise it would have been lvalue发布于 2017-06-27 12:59:38
一种类成员访问表达式,用于指示非引用类型的非静态数据成员,其中对象表达式为xvalue。
“类成员访问表达式”(即表单A.B的表达式)由两个部分组成:对象表达式( .之前的部分,A)和成员标识( .之后的部分,B)。
因此,本段仅在.之前的部分为xvalue时才适用。
涉及.*的示例非常类似于仅涉及.的示例
struct A {
int m;
};
int A::* p = &A::m;
A&& f();
std::cout << f().*p;表达式f().*p是xvalue。
https://stackoverflow.com/questions/44780161
复制相似问题