C++ 类成员访问表达式中的xvalue?

C++ 类成员访问表达式中的xvalue?,c++,C++,所以我读这篇文章是因为我对值何时被视为xvalue感到困惑,比如某个值何时到期/接近其生命周期结束。可悲的是,我仍然很困惑 无论如何,报价包括: 类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是 xvalue,或 指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针 答案中还包括一个示例,但它没有举例说明(我猜是)“一个指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针”,所以有人能给我看一个吗

所以我读这篇文章是因为我对值何时被视为xvalue感到困惑,比如某个值何时到期/接近其生命周期结束。可悲的是,我仍然很困惑

无论如何,报价包括:

  • 类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是 xvalue,或

  • 指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针

答案中还包括一个示例,但它没有举例说明(我猜是)“一个指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针”,所以有人能给我看一个吗

然而,当执行
f().m
时,它确实举例说明了“指定非引用类型的非静态数据成员的类成员访问表达式,其中对象表达式是xvalue”,并且
m
是即将结束的xvalue/右值这一事实对我来说是有意义的,因为
f()
返回右值引用。但是
a
是一个左值,那么如果你做了
a.m
,那不是仍然是一个左值吗

这里令人困惑的是,这个成员访问表达式仍然在指定非引用类型的非静态数据成员。。或者当说“其中对象表达式是一个xvalue”时,是否意味着类对象必须是一个右值

答案中提到的例子:

struct A {
    int m;
};

A&& operator+(A, A);
A&& f();
A a;
A&& ar = static_cast<A&&>(a);
结构A{ int m; }; A&&运算符+(A,A); A&&f(); A A; A&&ar=静态(A); 类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue

“类成员访问表达式”(即形式为
A.B
的表达式)由两部分组成,一部分是对象表达式(在
之前的部分,
A
)和成员标识(在
之后的部分,
B

因此,本段仅适用于
前面的部分为x值的情况

涉及
*
的示例与仅涉及
的示例非常相似:

struct A {
    int m;
};
int A::* p = &A::m;
A&& f();

std::cout << f().*p;
结构A{ int m; }; int A::*p=&A::m; A&&f(); 标准::cout 答案中还包括一个示例,但它没有举例说明(我猜是)“一个指向成员表达式的.*指针,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针”,所以有人能给我看一个吗

下面是一个例子:

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,这样整个类成员的访问表达式将被计算为一个xvalue,对吗?在这种情况下,xvalue是否表示右值?虽然我读过关于xvalues的书,但它们在我看来都像是右值。@noflow xvalues是rvalues@noflow从您发布的示例中,如前所述,它们都是xvalue(以及rvalue)。右值也可以是prvalue,因此不是xvalue(例如,一个函数按值返回一个非引用对象。除非您用它复制/初始化某个对象,否则您不能直接和立即访问该对象的属性(所谓的标识)。@noflow粗略的经验法则:左值=命名对象、动态对象、左值引用。xvalue=未命名的右值引用。prvalue=未命名的非引用对象。@noflow否。每个特定的glvalue要么是左值,要么是xvalue。不可能两者兼而有之。每个左值都是一个glvalue,但不一定相反。每个xvalue都是glvalue,但不一定是glvalue。谢谢!但是基于表达式是xvalue时的语句,我看不到任何地方提到左值,那么xvalue如何与左值关联呢?我确实了解了它们如何与右值关联,因为右值引用的生命周期即将结束(即xvalues,如果我错了,请再次更正我),这是您帮助我理解的。@最后一个概念的流程-它们没有关联,规则可能会阻止表达式成为xvalue,没错,但是如果xvalue是右值和glvalue,而glvalue包括左值,你怎么能说xvalue和左值不相关呢?等等,我想你误解了我说的。。。我说的是链接答案,其中包括关于表达式何时为xvalue的问题,我没有看到任何地方提到左值,那么xvalue如何与左值关联,而不仅仅是右值呢?@noflow图表仍然有效,因为我们讨论的是xvalue表达式,所以它是相关的,可能有助于消除更多的疑问
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