代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

普通的rvalue引用和std::forward返回的rvalue引用有什么区别?

  •  17
  • Rick Jim DeLaHunt  · 技术社区  · 6 年前

    我不能这么做:

    int &&q = 7;
    int &&r = q; 
    //Error Message:
    //cannot convert from 'int' to 'int &&'
    //You cannot bind an lvalue to an rvalue reference
    

    如果我理解正确,在初始化rvalue引用时,也会初始化一个临时变量。所以 int &&q = 7; 可视为:

    int temp = 7;
    int &&q = temp;
    

    当我在右边使用参考的时候,我实际上是在使用裁判。所以 int &&r = q; 可视为:

    int &&r = temp;  //bind an lvalue to an rvalue reference, cause error, understandable
    

    以上是我对编译器错误发生的理解。


    为什么添加 std::forward 能解决吗?

    int &&q = 7;
    int &&r = std::forward<int>(q);
    

    我知道 标准::前进 总是返回一个rvalue引用,引用是如何返回的 标准::前进 不同于 int&&q ?

    2 回复  |  直到 6 年前
        1
  •  13
  •   songyuanyao    6 年前

    如何返回引用 std::forward 不同于 int&&q ?

    他们的 value categories 是不同的。注意类型和价值类别是不同的。

    q lvalue ,因此它不能绑定到rvalue引用。

    (强调我的)

    变量的名称、函数、模板参数对象(因为C++ 20)或数据成员,而不考虑类型,例如 std::cin std::endl . 即使变量的类型是rvalue reference,由其名称组成的表达式也是左值表达式;

    而从函数返回的rvalue引用被限定为 xvalue ,属于 rvalue

    函数调用或重载运算符表达式,其返回类型是对对象的rvalue引用,例如 std::move(x) ;

        2
  •  10
  •   Angew is no longer proud of SO    6 年前

    表达式之间的差异 q std::forward<int>(q) 前者是一个左值,而后者是一个右值(属于基本类别xvalue)。

    我在 this answer :关键是 因为表达是 ,因为它有名字。 标准::向前<int>(q) (或同等 std::move(q)

    推荐文章