回答
移动构造函数只是另一个构造函数。如果重载构造函数,就像重载其他函数一样,调用哪个构造函数的选择归结为重载解析规则。也就是说,当你用Foo a(<some-expression>);
构造一个对象时,可能会有多个可能的构造函数,并且需要选择一个。
复制构造函数带有一个类型为const Foo&
的参数。此左值引用类型将绑定到表示Foo
对象的任何表达式。移动构造函数采用Foo&&
类型的一个参数。这个右值引用只会绑定到可修改的右值。实际上,在通过可修改的右值的情况下,这个超载将是首选。
这意味着在Foo a(<some-expression>);
如果表达式<some-expression>
是一个可修改的右值,移动构造函数将被选中。否则,选择复制构造函数。通常在表示临时对象时会出现可修改的右值(例如,从函数返回的对象)。也可以通过使用std::move
(例如Foo a(std::move(b));
)将表达式强制为右值表达式。
在你的Foo a(b)的例子中,'b'是一个命名对象,因此它不能是右值。这里需要'std :: move(b)'。 –
@MichaelGazonda我将'b'视为一般表达式,并非特别表达'b'。我会做得更清楚。 –
通常我们必须通过给出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.斯特劳斯)
- 1. Move构造函数调用基类移动构造函数
- 2. 用lambda调用移动构造函数
- 3. 与移动构造函数混淆:无法调用移动构造函数
- 4. 构造函数被“调用”与构造函数被“执行”?
- 5. 为什么移动构造函数不被调用?
- 6. 何时移动构造函数被调用?
- 7. 为什么我的C++移动构造函数未被调用?
- 8. emplace_back调用移动构造函数和析构函数
- 9. 当移动构造函数将在C++ 11中调用?
- 10. 为什么调用复制构造函数而不是移动构造函数?
- 11. 移动构造函数C++
- 12. 与移动构造函数
- 13. 移动构造函数不移动
- 14. 移动构造函数并移动类
- 15. 构造函数被调用多少次?
- 16. Rvalue构造函数没有被调用?
- 17. 构造函数被调用TWice
- 18. NPE在构造函数被调用
- 19. 拷贝构造函数不被调用?
- 20. 构造函数被再次调用?
- 21. 构造函数没有被调用
- 22. 基础构造函数未被调用
- 23. ISerialization构造函数没有被调用
- 24. 当一个构造函数被显式调用时,是否构造了构造函数和成员变量?
- 25. 移动构造函数和非常拷贝构造函数
- 26. 当赋值运算符与复制构造函数被调用?
- 27. 为什么基础移动构造函数的显式调用实际上调用基础构造函数?
- 28. 为什么移动构造函数在这种情况下不会被调用?
- 29. 使用boost :: pool_allocator时不会调用移动构造函数
- 30. 构造解释为函数调用,并移动构造strangly跳过
上的答案[该SO线程(http://stackoverflow.com/questions/3106110/what-is-move-semantics)将帮助你。 – wakjah