C++ 类成员访问表达式中的xvalue?
所以我读这篇文章是因为我对值何时被视为xvalue感到困惑,比如某个值何时到期/接近其生命周期结束。可悲的是,我仍然很困惑 无论如何,报价包括:C++ 类成员访问表达式中的xvalue?,c++,C++,所以我读这篇文章是因为我对值何时被视为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