xvalue / prvalue类别真的重要吗?

时间:2015-02-21 01:59:40

标签: c++11 xvalue

创建xvalue的唯一方法是使用static_cast< T&安培;&安培; >转换。 是的,according to standard还有其他三种情况,但所有情况都需要另一个xvalue。因此,为简单起见,我认为现在只是这样。

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

据我所知,对于对象而言,xvalue远比prvalue好,因为它具有动态类型;但奇怪的是,我不知道«gizmo»的任何动作,其产品prvalue包含对同一事物的引用:它看起来像将所有动作转换为«gizmo»到prvalue(如static_cast< T>或传递给函数)使用非引用结果)将创建临时对象(使用调用复制构造函数等)。

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

  1. 参考该值生成xvalue
    1. 参考临时对象(可能是值的副本)生成prvalue *
    2. 也许真正重要的是rvalue引用实际上指的是(相同的东西或副本)而不是xvalue / prvalue类别? 如果是这样,我们可能会认为static_cast< T&安培;&安培; >只是为了保存对同一事物的引用而不再关心xvalue / prvalue。不是吗?


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

1 个答案:

答案 0 :(得分:0)

例如,在使用xvalue推导规则时,

prvaluedecltype很重要。 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作为类型。