【发布时间】:2017-08-05 08:39:51
【问题描述】:
在对象上调用std::move后,为什么再使用该对象语言不会导致编译错误?
是不是因为编译器无法检测到这种情况?
【问题讨论】:
-
因为你可以用它做事,你可以重复使用它。移动使对象处于有效状态。
-
被移动对象的状态由移动构造函数定义。因此,只要移动构造函数允许,就可以使用它。
-
std::move只是将对象转换为T&&,它实际上并没有对对象做任何事情。 -
(1)
std::move只是一个没有数据更改的强制转换,因此需要编译器采取任何措施。 (2) 用std::move的结果做某事在大多数情况下太复杂而无法分析。 (3)如果std::move被实现为rvalue_ref_cast<T>,就不会问很多关于SO的问题 -
move遵循一个不错的古老 C++ 传统。就像move不会移动,remove不会删除,delete不会删除它的参数:)
标签: c++ c++11 compilation move-semantics stdmove