2014-12-21 127 views
5

我想知道什么时候移动构造函数在C++代码中调用。当移动构造函数被调用

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

+0

上的答案[该SO线程(http://stackoverflow.com/questions/3106110/what-is-move-semantics)将帮助你。 – wakjah

回答

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'是一个命名对象,因此它不能是右值。这里需要'std :: move(b)'。 –

+0

@MichaelGazonda我将'b'视为一般表达式,并非特别表达'b'。我会做得更清楚。 –

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()是一个标准的库函数返回一个rvalue参照其参数 move(x)意味着“给我一个rvalue参考×”。也就是说,std::move(x)不会移动任何东西,相反,它允许用户移动x。

来源:C++程序设计语言(B.斯特劳斯)

相关问题