【问题标题】:Does xvalue/prvalue category really matter?xvalue/prvalue 类别真的很重要吗?
【发布时间】:2015-02-21 01:59:39
【问题描述】:

创建 xvalue 的唯一方法是使用 static_cast 转换。 是的,according to standard 还有其他三种情况,但它们都需要另一个 xvalue。因此,为简单起见,我假设这是目前唯一的方法。

我们需要传递一些东西给 static_cast。让我们称之为«小发明»。 无论 gizmo 到底是什么(左值或右值),static_cast 的结果都将是对完全相同事物的右值引用(我的意思是它不会产生任何临时对象)。结果的值类别可以是 prvalue 或 xvalue(对于对象)。让我们考虑第二种情况。

我知道 xvalue 对于对象来说比 prvalue 要好得多,因为它具有动态类型;但奇怪的是,我不知道任何带有 «gizmo» 的动作,其产生包含对同一事物的引用的纯右值:看起来所有将 «gizmo» 转换为纯右值的动作(如 static_cast 或传递给函数非引用结果)将创建临时对象(调用复制构造函数等)。

总结一下,如果我们有对象类型的值,我们可以:

  1. 参照该值生成 xvalue

  1. 参考临时对象(可能是值的副本)生成纯右值*

也许真正重要的是右值引用实际上指的是(相同的事物或副本)而不是 xvalue/prvalue 类别? 如果是这样,我们可能会认为 static_cast 只是保存对同一事物的引用并且不再关心 xvalue/prvalue 的唯一方法。不是吗?


  • 当然,如果 value 已经是 prvalue,我们没有义务做一些事情来获得 prvalue,但在这种情况下,动态类型不会丢失。因此,再次与 xvalue 没有区别。

【问题讨论】:

  • 我不知道您的实际问题是什么。您是否正在寻找 xvalue 和 prvalue 行为不同的场景?
  • 我正在尝试编写 sn-p,其中不同行为的唯一原因是不同的值类别(xvalue/prvalue)。但是当我尝试将某些东西转换为prvalue时,它实际上会产生临时对象。看起来这种副作用是差异行为的主要原因。
  • 有我的尝试:ideone.com/3UrjTK
  • 我把这个问题看了至少六遍,但我仍然无法弄清楚实际上是在问什么问题。

标签: c++11 xvalue


【解决方案1】:

xvalueprvalue 在使用decltype 扣除规则时很重要,例如。 cppreference 说什么:

  • a) 如果表达式的值类别是xvalue,则decltype 产生T&&
  • b) 如果表达式的值类别是lvalue,则decltype 产生T&
  • c) 如果表达式的值类别是prvalue,则decltype 产生T

通过这种方式,编译器可以更好地提示即将出现什么样的表达式。当然,它只是在处理表达式的语义意义上很重要。

例子:

struct A {};
int main() {
    decltype(auto) a1 = A(); //prvalue, type of a1 is A
    decltype(auto) a2 = std::move(A()); //xvalue, type of a2 is A&&
}

在本例中使用autoa1a2 都会得到A 作为类型。

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多