调用移动构造函数时

时间:2014-12-21 21:09:47

标签: c++ c++11 constructor

我想知道何时在C ++代码中调用move构造函数。

这意味着,我知道当我调用Foo a(b)时它是复制构造函数,所以我有什么代码来调用移动构造函数。

2 个答案:

答案 0 :(得分:4)

移动构造函数只是另一个构造函数。如果你有重载的构造函数,就像重载任何其他函数一样,调用哪个构造函数的选择归结为重载决策的规则。也就是说,当您使用Foo a(<some-expression>);构造对象时,可能会有多个可能的构造函数,需要选择一个。

复制构造函数采用类型为const Foo&的一个参数。此左值引用类型将绑定到表示Foo对象的任何表达式。移动构造函数接受一个类型为Foo&&的参数。该右值引用仅绑定到可修改的右值。实际上,在传递可修改的右值的情况下,这种重载将是首选。

这意味着在Foo a(<some-expression>);中,如果表达式<some-expression>是可修改的右值,则将选择移动构造函数。否则,选择复制构造函数。当表示临时对象时(例如,从函数返回的对象),通常会出现可修改的右值。也可以使用std::move强制表达式为rvalue表达式,例如Foo a(std::move(b));

答案 1 :(得分: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)