c++11右值引用、std::move移动语义、std::forward完美转发的一些总结

清泛原创
  • std::move 实际上并不能移动任何东西,它唯一的功能是将一个左值强制转换为右值引用,继而用于移动语义。从实现上讲,它基本等同于一个类型转换: static_cast<T&&>(lvalue); 特别注意:它仅仅是挪走左值对象的内容,但左值对象本身生命周期不变,不会立即释放。
  • 移动语义通过移动构造函数实现:A(A&& a); A& A::operator=(const A&& a);通过右值引用匹配临时值。 一般地,提供移动构造函数的同时也会提供一个拷贝构造,防止移动不成功(没有移动构造函数)的时候还能拷贝构造,保障代码安全。对于一些基本类型如intchar[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)...); 
}

c++11 rvalue move forward

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部