我希望了解在C++代码中何时调用移动构造函数。
这意味着,我知道当我调用
这意味着,我知道当我调用
Foo a(b)
时,它是复制构造函数,那么我需要编写什么来调用移动构造函数。Foo a(b)
时,它是复制构造函数,那么我需要编写什么来调用移动构造函数。Foo a(<some-expression>);
构造对象时,可能会有多个可能的构造函数,需要选择一个。const Foo&
的参数。这个左值引用类型将绑定到表示Foo
对象的任何表达式上。移动构造函数需要一个类型为Foo&&
的参数。这个右值引用只能绑定到可修改的右值上。实际上,在传递可修改的右值的情况下,这个重载会被优先选择。Foo a(<some-expression>);
中,如果表达式<some-expression>
是可修改的右值,则会选择移动构造函数。否则会选择复制构造函数。通常在表示临时对象(例如从函数返回的对象)时,会出现可修改的右值。还可以通过使用std::move
来将表达式强制转换为右值表达式,例如Foo a(std::move(b));
。b
是一个命名对象,因此它不能是rvalue。这里需要使用std::move(b)
。 - Michael Gazonda通常我们通过给一个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。