std::move on 一个已经是 T&& 的变量
std::move on a variable which already is T&&
在"如何:编写移动构造函数"页面上,Microsoft有一个关于如何编写移动构造函数的示例。它本质上是这样的形式:
MyClass::MyClass(MyClass&& lhs)
{
*this = std::move(lhs);
}
我试过了,这里确实需要std::move
,但为什么?我认为move所做的唯一一件事就是转换为T&&
。但是lhs
已经是MyClass&&
类型了,不是吗?
命名的右值引用是左值。未命名的右值引用是右值这对于理解为什么std::move调用在:
foo&& r = foo(); foo f = std::move(r);
中是必要的很重要
看看这个答案:https://stackoverflow.com/a/5481588/1394283它很好地解释了这一点。
看看这个功能:
void foo(X&& x)
{
X anotherX = x;
// ...
}
有趣的问题是:X
的复制构造函数的哪个重载在foo
的主体中被调用?这里,x
是一个被声明为右值引用的变量。因此,很有可能预期x
本身也应该像右值一样结合,也就是说,应调用X(X&& rhs);
。
允许移动语义默认应用于有名称的东西,如
X anotherX = x;
// x is still in scope!
这将是危险的混乱和容易出错的,因为我们刚刚从中移动的东西,也就是我们刚刚窃取的东西,在随后的代码行中仍然可以访问但移动语义的全部目的是只在"无关紧要"的地方应用它,即我们移动的东西在移动后立即消失
这就是为什么右值引用的设计者选择了一个比这更微妙的解决方案:
声明为右值引用的事物可以是左值或右值。区别标准是:如果它有一个名称,那么它就是一个左值。否则,它就是一个右值
来源:http://thbecker.net/articles/rvalue_references/section_05.html
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- 读入变量时循环终止,'Range_error' on C++
- 瓦尔格林德对带有默认参数的变量进行"conditional jump on uninitialized value"
- std::move on 一个已经是 T&& 的变量