根据 \xc2\xa73.10\\1 的定义
\n\n\n\n\n左值(\xe2\x80\x9cgeneralized\xe2\x80\x9d 左值) 是左值或 x 值
\n
在哪里
\n\n\n\n\n每个表达式都属于该分类中的基本分类之一:左值、\n x值或纯右值。
\n
这里的分类法:
\n\n
因此,例如,每个左值都是左值:
\n\nint 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.\nRun Code Online (Sandbox Code Playgroud)\n
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和表达式”。
我们使用它来描述引用对象的表达式,而不是“存在”这些对象。
| 归档时间: |
|
| 查看次数: |
931 次 |
| 最近记录: |