【问题标题】:Aren't xvalues both glvalues and rvalues?xvalues不是glvalues和rvalues吗?
【发布时间】: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++


【解决方案1】:

如果一个glvalue是一个左值或一个xvalue并且一个rvalue是一个prvalue或一个xvalue,那么说g()是一个glvalue而不说它也是一个rvalue是不是错了?

是的。

如果g() 是一个xvalue,那么它既是一个glvalue又是一个rvalue。

【讨论】:

  • 但是说“这个重载集区分左值(它在 x 的位置)和纯右值(它在 y 的位置)”和“重载集区分左值(它在 w 的位置)”并没有错和右值(它在哪里做z)”。我无法想出以不同方式处理左值、xvalues 和 prvalues 很重要的情况,但是这样的三分法是可能的
  • @Caleth:确实
  • @Caleth 您打算如何使用重载解析来区分纯右值和异值?
  • @Columbo 绑定到std::remove_const_t<T> &? ...您是说 is_prvalue<T> 特征是不可能的吗?
  • @Caleth 我的意思是重载解析不能(通常)区分 xvalues 和 prvalues。
【解决方案2】:

据我了解here

  • glvalue == 有身份和
  • 右值 == 可以移出。

所以你的分析是正确的,因为 xvalue

  • 可以从和
  • 移动
  • 有身份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多