左值参考的右值参考与左值/右值的右值引用
rvalue refrence of lvalue reference vs rvalue reference of lvalue/rvalue
对左值引用进行右值引用合法吗?
考虑下面的例子,在最后的rvalureRef中,这两种情况在指代或类型(或其他事物)方面有区别吗?
Type& ref = GetReference()
Type&& rvalueRef = std::move(ref)
vs
Type value = GetValue()
Type&& rvalueRef = std::move(value)
这两个代码在C++中都是正确且100%合法的。区别仅在于,在第一种情况下,引用被移动(或者更好地说,如果使用了适当的目的地,则能够被移动),而在第二种情况中,它是副本(请参阅下面的示例对此进行说明)。
请注意,std::move
实际上并没有移动对象。它只将对象强制转换为右值引用类型仅此而已。
还要注意的是,在和两种情况下,rvalueRef
仍然是一个左值—具有名称(即要引用的标识符)的对象永远不是右值。因此,如果您没有再次使用std::move
(或使用显式强制转换)来移动它,那么就没有任何区别。
下面是一个具体的例子:
//given function
std::string& GetReference();
std::string GetValue();
//target function
void f(std::string param);
您的代码如下:
std::string& ref = GetReference();
std::string&& rvalueRef = std::move(ref);
std::string value = GetValue()
std::string&& rvalueCopy = std::move(value); //named changed
到目前为止,没有任何差异。
但如果你这样做:
f(std::move(rvalueRef)); //actual object returned from GetReference is moved!
f(std::move(rvalueCopy)); //only a copy is moved.
在第一种情况下移动实际对象,在第二种情况下,移动副本。如果你这样做,根本没有什么区别:
f(std::move(GetReference())); //actual object returned from GetReference is moved!
f(std::move(GetValue())); //only a copy is moved.
因此,您可以看到,在您的代码中,没有任何区别,因为根本没有实际的移动。只有演员阵容。要进行实际的移动,应该有一个合适的目标类型,可以调用移动构造函数或移动赋值!在您的情况下,两者都没有调用。
Q 对左值引用进行右值引用合法吗
这不是你真正要问的问题。你真正要问的问题是:
Q 将左值引用强制转换为右值引用合法吗
答案是肯定的。std::move
只是将它的自变量强制转换为一个右值引用,它总是合法的。所做操作的总体正确性取决于您对std::move
的结果所做的操作。您的示例代码没有任何错误。
Q 这两种情况有区别吗
// case 1 // case 2
Type& ref = GetReference(); Type value = GetValue();
f(std::move(ref)); f(std::move(value));
唯一的区别是,在情况1中,ref
是对GetReference()
返回的对象的引用,但在情况2中,value
是GetValue()
返回对象的副本。
- 通用参考 l 值不复制对象
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- Lambda闭包左值可以作为右值参考参数传递
- 如何获取地图值的参考?
- 演绎指南中的参考文献和值之间的差异
- 赋值运算符的返回值可以作为参考吗?
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 超载函数既不按值,也不是通过参考来对象,而是将撤销的指针换成对象
- 移动 l 值参考参数是否是一种不好的做法?
- C 按值返回与参考返回
- 为什么未调用具有常量参考返回值的超载方法
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 作为RVALUE参考与双移动值的传递
- 可以std ::移动引起切片时切入L值参考
- 为什么通用参考和右值参考的流量不同
- 提供功能版本,其中可用值和参考
- 通过值和参考,对象构建返回对象之间的区别
- 按值传递参考参数
- C 模板函数基于参数是值还是参考
- 使用具有默认值的参考参数是一种良好的做法