【发布时间】:2016-05-04 10:11:39
【问题描述】:
This answer 像这样编写移动构造函数:
dumb_array(dumb_array&& other)
: dumb_array() // initialize via default constructor, C++11 only
{
swap(*this, other);
}
注意:这个swap 是一个自定义交换,也在类上定义,而不是std::swap。
This answer 建议使用std::move:
你应该只在适当的地方调用 std::move,但这是个人喜好进来的。
我刚刚观看了 Scott Meyers 关于移动语义的演讲,他说作为函数参数的 rvalue 引用由于它现在被命名,因此被转换为左值,因此 std::move有必要再次将其转回右值。
换句话说,上面的代码很可能不会进行移动操作,而且与上面的引用不同,在这种情况下使用std::move 不是出于个人偏好,而是为了实际获得移动语义的好处。
如果 std::move 没有在移动构造函数或移动赋值运算符中显式使用,那么是否准确地说,移动可能实际上并没有发生,而是正在完成复制?
【问题讨论】:
-
@erip 因为我们基于标准而不是基于实现(理想情况下)编写代码,所以应该不难说出标准建议我们做什么。 Meyers 说 std::move 最常见的用法是在一个函数内部引用一个右值参数,但我很少在在线示例中看到这样做
-
澄清一下,您问的是使用
move而不是 的swap?与同时使用两者相反,swap(*this, move(other))?后者当然毫无意义,但它可能有助于真正澄清替代方案是什么
标签: c++11