【发布时间】:2012-07-26 08:25:19
【问题描述】:
例如,见this code:
template<class T>
void swap(T& a, T& b)
{
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
只是我,还是这里有错误?如果你把movea变成tmp,那么a不就失效了吗?
即从b 到a 的移动分配不应该是一个带有位置new 的移动构造函数调用吗?
如果不是,那么移动构造函数和移动赋值运算符有什么区别?
template<class T>
void swap(T& a, T& b)
{
T tmp(std::move(a));
new(&a) T(std::move(b));
new(&b) T(std::move(tmp));
}
【问题讨论】:
-
@FredOverflow:感谢您提供的链接,这些很有帮助。但我不明白:如果移动分配不需要需要一个有效的目标开始,那么移动构造的意义何在?那它们不就是一回事吗?
-
@Mehrdad:假设您有一个对象,其构造和复制操作成本很高。当您创建一个临时对象(例如,一个 r 值对象)时,您首先调用代价高昂的构造函数,然后调用代价高昂的复制构造函数。但是使用移动构造函数可以避免昂贵的复制,取而代之的是更轻量的复制操作(例如,将指针复制到已分配的数组,而不是分配新数组并复制其内容)。
-
@Mehrdad 你还是一头雾水。就像复制赋值一样,移动赋值确实需要一个有效的目标对象。从一个对象移动不会使它无效。被移动的对象仍然是一个对象,需要像任何其他对象一样被破坏。如果移出的对象因某种原因无效,几乎所有重要的析构函数都会在尝试销毁它时对系统造成严重破坏。
标签: c++ c++11 swap move-semantics move-constructor