【发布时间】:2017-06-30 14:35:26
【问题描述】:
我读到了answer 引起我注意的部分是:
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 是左值或 xvalue,而 rvalue 是 prvalue 或 xvalue,那么说 g() 是一个glvalue而不说它也是一个右值?与std::move(i) 相同。
上面代码的我的版本是什么样子的:
h() // rvalue (prvalue)
g() // glvalue and rvalue (xvalue)
f() // glvalue (lvalue)
i // glvalue (lvalue)
*p // glvalue (lvalue)
std::move(i) // glvalue and rvalue(xvalue)
至于标准所说的(我只引用最相关的部分):
一个右值(所谓的,历史上,因为右值可能出现在 赋值表达式的右侧)是一个 xvalue
和
glvalue(“广义”左值)是左值或 xvalue。
当然,我可能是错的。如果是这样,请帮帮我:)
【问题讨论】:
-
您的选择性引用具有严重的误导性。 “一个右值 [...] 是一个 xvalue”是从一个结构为“一个右值 [...] 是一个 xvalue、临时对象 [...] 或一个值 [...]”的句子中剪下来的。截断“或”部分会显着改变含义。
-
@CharlesBailey 好吧,我是故意这样做的,因为我猜其中最相关的部分是右值被视为 xvalues。
标签: c++