场景:

  1. 在 remove_reference 结构体中能看到右值引用的身影 &&, 那么这里的右值引用究竟有什么用呢?

  2. 常常也发现int& 和int&& 这两种相似的应用类型,第一种是左值引用声明,另外一种是右值引用声明.
  3. 下面的样例直接參考的 cppreference,已经写的非常完整了,不是必需又一次写.

參考:

1.Reference declaration

2.Rvalue Reference Declarator: &&

3.Lvalue Reference Declarator: &

语法

左值引用声明: & attr(optional) declarator (1)

右值引用声明: && attr(optional) declarator (2) (since C++11)

左值引用声明 &

–1. 左值引用能够理解为对象的别名, 左值引用必须被初始化并且不能被又一次赋值.

  1. #include <iostream>
  2. #include <string>
  3. int main()
  4. {
  5. std::string s = "Ex";
  6. std::string& r1 = s;
  7. const std::string& r2 = s;
  8. r1 += "ample"; // modifies s
  9. // r2 += "!"; // error: cannot modify through reference to const
  10. std::cout << r2 << '\n'; // prints s, which now holds "Example"
  11. }

–2. 在调用函数时,能够被用来作为引用參数.

  1. #include <iostream>
  2. #include <string>
  3. void double_string(std::string& s)
  4. {
  5. s += s; // 's' is the same object as main()'s 'str'
  6. }
  7. int main()
  8. {
  9. std::string str = "Test";
  10. double_string(str);
  11. std::cout << str << '\n';
  12. }

–3. 当一个函数的返回值是左值时, 这个函数的调用的表达式能够被觉得是一个左值表达式.


  1. #include <iostream>
  2. #include <string>
  3. char& char_number(std::string& s, std::size_t n)
  4. {
  5. return s.at(n); // string::at() returns a reference to char
  6. }
  7. int main()
  8. {
  9. std::string str = "Test";
  10. char_number(str, 1) = 'a'; // the function call is lvalue, can be assigned to
  11. std::cout << str << '\n';
  12. }

右值引用声明 &&

–1. 右值引用声明能够差别一个左值和右值.

–2. 右值引用直至Move语义的实现, 它能够把暂时对象(一般不能引用)的资源移动到其它地方去.

–3. 右值引用也能够用来扩展暂时对象的生命周期,

  1. #include <iostream>
  2. #include <string>
  3. int main()
  4. {
  5. std::string s1 = "Test";
  6. // std::string&& r1 = s1; // error: can't bind to lvalue
  7. const std::string& r2 = s1 + s1; // okay: lvalue reference to const extends lifetime
  8. // r2 += "Test"; // error: can't modify through reference to const
  9. std::string&& r3 = s1 + s1; // okay: rvalue reference extends lifetime
  10. r3 += "Test"; // okay: can modify through reference to non-const
  11. std::cout << r3 << '\n';
  12. }

–4. 假设函数有左值和右值引用的重载,调用时会匹配调用, 传左值调用左值重载, 右值调用右值重载. 这样就能够支持Move Constructor 和 Move Assignment 的实现.

  1. #include <iostream>
  2. #include <utility>
  3. void f(int& x)
  4. {
  5. std::cout << "lvalue reference overload f(" << x << ")\n";
  6. }
  7. void f(const int& x)
  8. {
  9. std::cout << "lvalue reference to const overload f(" << x << ")\n";
  10. }
  11. void f(int&& x)
  12. {
  13. std::cout << "rvalue reference overload f(" << x << ")\n";
  14. }
  15. int main()
  16. {
  17. int i = 1;
  18. const int ci = 2;
  19. f(i); // calls f(int&)
  20. f(ci); // calls f(const int&)
  21. f(3); // calls f(int&&)
  22. // would call f(const int&) if f(int&&) overload wasn't provided
  23. f(std::move(i)); // calls f(int&&)
  24. }

[C++11]_[0基础]_[左值引用声明和右值引用声明]的更多相关文章

  1. [Zlib]_[0基础]_[使用zlib库压缩文件]

    场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比較经常使用,编译也方便,使用它来做压缩吧. MacOSX平台默认支持z ...

  2. [C/C++11语法]_[0基础]_[lamba 表达式介绍]

    场景 lambda 表达式在非常多语言里都有一席之地,由于它的原因,能够在函数里高速定义一个便携的函数,或者在函数參数里直接高速构造和传递. 它能够说是匿名函数对象,一般仅仅适用于某个函数内,仅仅做暂 ...

  3. [libcurl]_[0基础]_[使用libcurl下载大文件]

    场景: 1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例 ...

  4. [wxWidgets]_[0基础]_[经常更新进度条程序]

    场景: 1. 非常根据程序的进展需要处理业务,以更新进度条,进度条的目的是为了让用户知道业务流程的进度.一个进度条程序更友好,让用户知道在程序执行.不是没有反应. 2. 现在更新见过这两种方法的进展. ...

  5. [C/C++标准库]_[0基础]_[使用fstream合并文本文件]

    场景: 1. 就是合并文本文件,而且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192 ...

  6. [C/C++]_[0基础]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和差别]

    场景: 1. C++的对象差别于C的原因是他们能够有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比較复杂. 2. 非常多情况下我们须要一个父类来存储子类的指针对象进行通用方法的 ...

  7. [ATL/WTL]_[0基础]_[CBitmap复制图片-截取图片-平铺图片]

    场景: 1.当你须要截取图片部分区域作为某个控件的背景. 2.须要平铺图片到一个大区域让他自己主动放大时. 3.或者须要合并图片时. 代码: CDC sdc; CDC ddc; sdc.CreateC ...

  8. [C/C++标准库]_[0基础]_[交集和补集]

    场景: 1. 计算std::vector A和 std::vector B里的同样的元素, 用于保留不删除. 2. 计算std::vector A和 std::vector B里各自的补集, 用于删除 ...

  9. [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]

    std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...

随机推荐

  1. Nginx快速安装

    登录nginx官网,点击download 点击稳定版本 复制箭头上面的内容 vim /etc/yum.repos.d/nginx.repo 修改yum文件 将复制的内容粘贴上去 yum list | ...

  2. Selenium WebDriver- 使用显示等待,判断搜狗的输入框是否显示,按钮是否可点击,然后在输入光荣之路搜索词,然后在点击搜索。

    #encoding=utf-8 from selenium import webdriver import time from selenium.webdriver.common.by import ...

  3. 如何让ie8/ie7/ie6支持html5的<footer></footer><nav></nav>等标签

    使用他们能让代码语义化更直观,而且更方便SEO优化.但是此HTML5新标签在IE6/IE7/IE8上并不能识别,需要进行JavaScript处理.以下就介绍几种方式. 方式一:Coding JavaS ...

  4. HTTP重定向

    404 Not Found301 Moved Permanently302 Found500 Internal Server ErrorHTTP重定向就是通过301和302两种状态码来实现的. 302 ...

  5. Js 希望某链接只能点击一次

    <a onclick=”function(){...}”> 希望这连接只能执行一次 <a onclick=”function(){...}; this.onclick()=funct ...

  6. 【bzoj3698】XWW的难题 有上下界最大流

    题目描述 XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A ...

  7. BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】

    题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...

  8. IBM DB2 控制中心等图形工具在 Windows 下的字体设置

    原文地址(直接看原文): http://loveseaside.iteye.com/blog/648941 [简介如下] IBM DB2 在版本 8.0 以上就提供了一个跨平台的基于 Java 的一套 ...

  9. [APIO2015] 雅加达的摩天楼 (分块,最短路)

    题目链接 Solution 分块+\(Dijkstra\). 难点在于建边,很明显 \(O(n^2)\) 建边会挂一堆 . 那么考虑一下, \(n^2\) 建边多余的是哪些东西 \(???\) 很显然 ...

  10. python 缺少包

    https://pypi.python.org/pypi/pdfminer/20140328 到这里下载相应的包,再进行安装. tar  –xivf  pybloomfilter-1.0 cd  py ...