glvalue的真实例子和解释?

AnA*_*ons 3 c++ c++11

我知道“ xvalues”,“ prvalues”,“ rvalues”和“ lvalues”是什么,它们有什么帮助,我已经看到了它们的真实示例。但是我从来不了解“ glvalue”是什么,以及它如何与其他人合作。我到处搜索过,但运气不好,即使在最新的标准论文中也很少有人注意到。有人可以向我解释一下并显示一些示例吗?

请注意,这不是重复这个,因为即使是有没有人给“glvalue”的一个例子。这里也是。几乎没有这样提到:

glvalue(“广义”左值)是左值或x值。

Bar*_*rry 5

根据 \xc2\xa73.10\\1 的定义

\n\n
\n

(\xe2\x80\x9cgeneralized\xe2\x80\x9d 左值) 是左值或 x 值

\n
\n\n

在哪里

\n\n
\n

每个表达式都属于该分类中的基本分类之一:左值、\n x值或纯右值。

\n
\n\n

这里的分类法:

\n\n

在此输入图像描述

\n\n

因此,例如,每个左值都是左值:

\n\n
int x = 7; // x is an lvalue. x is also a glvalue.\n           // 7 is a literal, so it is a prvalue. 7 is not a glvalue.\n\nauto foo = static_cast<int&&>(x); // foo is an lvalue, so it is a glvalue\n                                  // the cast is an rvalue but not a prvalue,\n                                  // it is an xvalue. so it is a glvalue.\n
Run Code Online (Sandbox Code Playgroud)\n


Col*_*mbo 5

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)
Run Code Online (Sandbox Code Playgroud)

正如您问题中的引号明确指出的那样,类别glvalue包括所有xvalues和lvalues。左值,x值和pr值是互补的类别:

每个表达式恰好属于该分类法的基本分类之一:lvalue,xvalue或prvalue。

您应该熟悉左值。现在考虑什么是xvalues [expr] / 6:

[ 注意:如果表达式是xvalue,则它是:

  • 调用函数(无论是隐式还是显式)的结果,该函数的返回类型是对对象类型的右值引用,
  • 转换为对对象类型的右值引用,
  • 一个类成员访问表达式,它指定对象引用是xvalue的非引用类型的非静态数据成员,或者
  • 一个.*指向成员的指针表达式,其中第一个操作数是一个x值,第二个操作数是一个指向数据成员的指针。

[…] —尾注 ]

因此,粗略地说,您可以将glvalues视为
“所有包含rvalue引用的lvalues和表达式”。
我们使用它来描述引用对象的表达式,而不是“存在”这些对象。