移动构造函数何时被调用

5
我希望了解在C++代码中何时调用移动构造函数。
这意味着,我知道当我调用Foo a(b)时,它是复制构造函数,那么我需要编写什么来调用移动构造函数。

这篇 SO 线程 上的答案可以帮助你。 - wakjah
2个回答

4
一个移动构造函数就是另一个构造函数。如果您有重载的构造函数,就像其他重载的函数一样,选择调用哪个构造函数取决于重载解析规则。也就是说,当您使用Foo a(<some-expression>);构造对象时,可能会有多个可能的构造函数,需要选择一个。
复制构造函数需要一个类型为const Foo&的参数。这个左值引用类型将绑定到表示Foo对象的任何表达式上。移动构造函数需要一个类型为Foo&&的参数。这个右值引用只能绑定到可修改的右值上。实际上,在传递可修改的右值的情况下,这个重载会被优先选择。
这意味着在Foo a(<some-expression>);中,如果表达式<some-expression>是可修改的右值,则会选择移动构造函数。否则会选择复制构造函数。通常在表示临时对象(例如从函数返回的对象)时,会出现可修改的右值。还可以通过使用std::move来将表达式强制转换为右值表达式,例如Foo a(std::move(b));

1
在你的Foo a(b)的例子中,b是一个命名对象,因此它不能是rvalue。这里需要使用std::move(b) - Michael Gazonda
@MichaelGazonda 我将'b'视为一般表达式,而不是特定的表达式'b'。我会让它更清晰明了。 - Joseph Mansfield

3

通常我们通过给一个rvalue引用参数来告诉它。例如:

template<class T>
void swap(T& a, T& b)
{
  T tmp = std::move(a);
  a = std::move(b);
  b = std::move(tmp);
}
move()是一个标准库函数,返回其参数的右值引用。move(x)的意思是“给我一个x的右值引用”。也就是说,std::move(x)并不会移动任何东西,而是允许用户移动x。
来源:《C++程序设计语言》(B. Stroustrup)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接