我知道' xvalues',' prvalues'' rvalues'和' lvalues'它们是如何有用的,我已经看到了它们的真实例子。但我从来不明白什么是' glvalue'是,以及它如何与其他人合作。我到处搜索,但即使在最新的标准论文中也没有运气,几乎没有人注意到。有人可以向我解释并展示一些例子吗?
请注意,这不是this的重复,因为即使没有人提供' glvalue'的例子。这里too。它几乎没有像这样提到:
glvalue(“generalized”左值)是左值或x值。
答案 0 :(得分:4)
glvalue是任何不是prvalue的东西。示例是实体的名称,或具有引用类型的表达式(无论引用的类型如何)。
int i;
int* p = &i;
int& f();
int&& g();
int h();
h() // prvalue
g() // glvalue (xvalue)
f() // glvalue (lvalue)
i // glvalue (lvalue)
*p // glvalue (lvalue)
std::move(i) // glvalue (xvalue)
正如您问题中的引语明确指出的那样, glvalue 类别包括所有xvalues和lvalues。左值,x值和prvalues是互补的类别:
每个表达式都属于基本的一个 此分类中的分类:lvalue,xvalue或prvalue。
你应该熟悉左值。现在考虑xvalues是什么,[expr] / 6:
[注意:表达式是xvalue,如果它是:
- 调用函数的结果,无论是隐式还是显式,其返回类型是对象类型的右值引用,
- 强制转换为对象类型的右值引用,
- 一个类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是 xvalue或
.*
指向成员的表达式,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针。[...] - 结束记录]
因此,粗略地说,您可以将glvalues视为“所有左值以及涉及右值参考的表达式”。
我们用它来描述引用对象而不是“成为”那些对象的表达式。
答案 1 :(得分:3)
根据§3.10\ 1
的定义glvalue (“广义”左值)是左值或x值
,其中
每个表达式都属于此分类法中的基本分类之一:左值, xvalue或prvalue。
这里的分类:
因此,例如,每个左值都是一个glvalue:
int x = 7; // x is an lvalue. x is also a glvalue.
// 7 is a literal, so it is a prvalue. 7 is not a glvalue.
auto foo = static_cast<int&&>(x); // foo is an lvalue, so it is a glvalue
// the cast is an rvalue but not a prvalue,
// it is an xvalue. so it is a glvalue.