来自类成员访问表达式的xvalue?

时间:2017-06-27 12:20:18

标签: c++

所以我读了这个answer,因为我很困惑什么时候将值视为xvalue,比如当一个值到期/接近其生命周期结束时。可悲的是,我仍然很困惑。

无论如何,报价包括:

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

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

  •   

答案中还有一个例子,但它没有举例说明(我猜)" a。*指向成员的表达式,其中第一个操作数是x值,第二个操作数是指向数据成员。",那么有人可以给我看一个吗?

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

这里的混淆是这个成员访问表达式仍指定非引用类型的非静态数据成员。或者当说"其中对象表达式是xvalue"时,它是意味着类对象必须是一个右值?

答案中提到的例子:

struct A {
    int m;
};

A&& operator+(A, A);
A&& f();
A a;
A&& ar = static_cast<A&&>(a);

2 个答案:

答案 0 :(得分:2)

  

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

A&#34;类成员访问表达式&#34; (即,A.B形式的表达式)由两部分组成,对象表达式.之前的部分,A)和会员身份识别(.之后的部分,B)。

因此,本段仅适用于.之前的部分是xvalue。

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

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

std::cout << f().*p;

表达式f().*p是xvalue。

答案 1 :(得分:0)

  

答案中还有一个例子,但它没有举例说明(我猜)“a。*指向成员的表达式,其中第一个操作数是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

这意味着访问非引用类型的非静态数据成员可以具有左值或x值值类别,具体取决于对象表达式的值类别(即点.之前的部分)。无论如何,如果数据成员是引用类型,它将始终为左值。

E.g。

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