- std::move 实际上并不能移动任何东西,它唯一的功能是将一个左值强制转换为右值引用,继而用于移动语义。从实现上讲,它基本等同于一个类型转换:
static_cast<T&&>(lvalue);
特别注意:它仅仅是挪走左值对象的内容,但左值对象本身生命周期不变,不会立即释放。 - 移动语义通过移动构造函数实现:
A(A&& a); A& A::operator=(const A&& a);
通过右值引用匹配临时值。 一般地,提供移动构造函数的同时也会提供一个拷贝构造,防止移动不成功(没有移动构造函数)的时候还能拷贝构造,保障代码安全。对于一些基本类型如int
和char[10]
等,使用std::move()
仍然会发生拷贝,因为没有对应的移动构造函数。 - 对于完美转发而言,右值引用并非“天生神力”,只是c++11新引入了右值,因此为其新定下了引用折叠的规则,以满足完美转发的需求。
emplace_back()
能就地通过参数构造对象,不需要拷贝或移动内存。- 右值引用、完美转发、可变模板参数写的一个万能函数包装器:
template <class Func, class... Args>
inline auto FuncWrapper(Func&& f, Args&& ... args) -> decltype(f(std::forward(args)...)) {
return f(std::forward(args)...);
}