右值引用、std::move()

参考文章

模板参数的右值引用形参

template <typename T>
void f5(T&&);

当函数是一个模板函数的时候,当他的形参是右值引用的时候有如下的不同:

传入左值,传入值的类型被推断为类型的引用
比如,传入string类型,那么T被推断为string&
同时,引用折叠:怎么说,意思就是左值引用的引用就等于引用,也是是,所有的双数引用可以折叠为右值引用。
而所有单数的引用可以折叠为左值引用

T&& && &&=T&&
T&& && && & =T&

因此,综上棉量两点:
当T = string &&是,传入的参数类型为string& &&,因此被折叠为string &。
这就是模板函数的右值引用形参可以接受一个左值的原因。

普通函数的右值引用形参

stl大量的使用了type_traits技术来提取参数类型

例如std::move()

template <class _Ty>
inline constexpr typename remove_reference<_Ty>::type &&
move(_Ty &&_Arg) _NOEXCEPT
{ // forward _Arg as movable
    return (static_cast<typename remove_reference<_Ty>::type &&>(_Arg));
}

remove_reference<_Ty>

template <class _Ty>
struct remove_reference
{ // remove reference
    typedef _Ty type;
};

template <class _Ty>
struct remove_reference<_Ty &>
{ // remove reference
    typedef _Ty type;
};

template <class _Ty>
struct remove_reference<_Ty &&>
{ // remove rvalue reference
    typedef _Ty type;
};

因此remove_reference能够根据传入参数的不同,在其typedef _Ty type中萃取出传入的类型。
std::move中的static_cast<typename remove_reference<_Ty>::type &&>(_Arg)进行类型转换。

步骤是:根据传入的参数,萃取出参数的类型,然后转化为参数的右值引用类型。

编译器行为

现在的编译器基本上都会做返回值优化(return value optimization)。也就是说,编译器会在函数返回的地方直接创建对象,而不是在函数中创建后再复制出来。很明显,这比move语义还要好一点。

这也就是为什么有的时候,栈参数的地址比函数内对象的地址还要低。因为要返回的对象被直接创建在返回值处。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 8,706评论 1 52
  • C++右值引用 右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)...
    小白将阅读 1,937评论 2 13
  • 本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。 左...
    深红的眼眸阅读 9,770评论 1 11
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 2,354评论 1 10
  • 函数传参 普通函数 非常量引用 在普通函数中,当形参是一个类型的引用时: 那么,函数f1可以接受下列形式的实参: ...
    Myth52125阅读 904评论 0 0
  • 必须理解:一位君主,尤其是一位新的君主,不能够实践那些被认为是好人应做的所有事情;因为他要保持国家,常常不得不背信...
    李泽贤阅读 948评论 0 2
  • 虽然,在母亲眼里,我们的父亲不是一个好丈夫,但是,在我们眼里绝对是一个好父亲,一个能干,聪明,善良,乐观,有孝心值...
    悦糖糖阅读 349评论 9 6
  • 三月,樱花满树,暗香浮动;四月,海棠似胭脂点点,楚楚有致。如今的我,站在这一片春意盎然中,采一朵玉兰挽在鬓间,携一...
    左小蕊阅读 235评论 0 0
  • 需求# 实现难点## 1 创建表时 创建好学生节点之后,需要将创建好的链表存入文件。本项目是利用的c语言的文件操作...
    陈果123阅读 4,812评论 2 4
  • 昨夜勸人入夢尋仙境 今夕盜圖圓黃粱美夢 人生短 莫辜負
    林素兮阅读 189评论 4 3