我想知道何时在C ++代码中调用move构造函数。
这意味着,我知道当我调用Foo a(b)
时它是复制构造函数,所以我有什么代码来调用移动构造函数。
答案 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)