普通的右值引用和 std::forward 返回的引用有什么区别?
What's the difference between an ordinary rvalue reference and one returned by std::forward?
我不能这样做:
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);
我知道std::forward
总是返回一个右值引用,std::forward
返回的引用与int&&q
有何不同?
std::forward
返回的引用与int&&q
有何不同?
它们的价值类别是不同的。请注意,类型和值类别是不同的东西。
q
是命名变量,它被限定为左值,因此不能绑定到右值引用。
(强调我的(
变量、函数、模板参数对象(自 C++20 起(或数据成员的名称,无论类型如何,例如
std::cin
或std::endl
。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;
而从函数返回的右值引用被限定为 xvalue,它属于 rvalue。
函数调用或重载运算符表达式,其返回类型是对对象的右值引用,例如
std::move(x)
;
表达式q
和std::forward<int>(q)
之间的区别在于前者是左值,而后者是右值(基本类别 xvalue(。
我在这个答案中也谈到了类似的问题:关键是q
作为一个表达式是一个左值,因为它有一个名字。std::forward<int>(q)
(或等效的std::move(q)
(是没有名称的表达式,并且由于它们返回(未命名的(右值引用,因此它们是 x值,它是 rvalue 的子类别,因此可以绑定到右值引用。
相关文章:
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量