C++11 右值引用简化代码的例子

原创 2015年11月20日 18:52:47

C++11中引入了右值引用的概念
这里不再解释什么是右值引用,用一个例子说明右值引用对代码带的一些简化效果
下面是将一个方法分为两个版本,第一个方法中newNode使用右值引用参数newNode,第二个则是左值引用的

    /* 右值引用版本 */
    HashNode& insertNode(HashNode&& newNode) {
    //do something
    }
    /* 左值引用版本 */
    HashNode& insertNode(HashNode& newNode) {
        return insertNode(std::move(newNode));//将newNode转为右值引用参数,调用右值引用版本的函数
    }

以下是正常的左值引用调用

HashNode node{1,2};
insertNode(node);//调用左值引用版本的参数; 

如果node只是个临时临时对象,并不需要保存给后面的代码使用,在没有右值引用版本的情况下,只能按上面的方式调用
因为我们定义了右值引用版本的insertNode函数,所以就可以如下调用。不用再定义一个临时对象node

insertNode(HashNode {1,2});//如果没有右值引用版本,编译会报错。

更进一步,还可以这样简写,连类名都省略了:

insertNode({1,2});//如果没有右值引用版本,编译会报错。

如果觉得分别写两个引用版本的函数太麻烦,可以删除最前面代码中左值引用版本的函数,只保留右值引用的版本。

那么,在用左值引用调用时要用std::move转为右值引用,例子如下:

HashNode node{1,2};
insertNode(std::move(node));//std::move将 node转为右值引用
版权声明:本文为博主原创文章,转载请注明源地址。

C++引用详解及与指针异同点

一、引用详解 引用:就是对某一变量(或对象)取一个别名,对变量的引用 的操作与对变量本身直接操作完全一样。 引用的声明:类型标识符 &引用名=目标变量名;   如下:定义变量a的引用aa,即别名。  ...
  • ljheee
  • ljheee
  • 2016年08月12日 11:22
  • 1021

C++11:深入理解右值引用,move语义和完美转发

乍看起来,move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得你可以将传来的任意参数转发给 其他函数,而右值引用使得move语义和完美转发成为可能。然而,慢慢地你发现这不那么...
  • booirror
  • booirror
  • 2015年04月15日 12:45
  • 27715

C++11笔记(3)——引用&指针辨析

指针和引用辨析,异同区分
  • u012424148
  • u012424148
  • 2016年08月27日 18:29
  • 195

C++11尝鲜:右值引用和转发型引用

解决移动语义及完美转发问题
  • zwvista
  • zwvista
  • 2013年10月05日 19:52
  • 10185

C++11中多线程例子

C++11开始,自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提高的线程库来进行并发编程。这里为了方便线程的使用,参考了android源码中...
  • zhx6044
  • zhx6044
  • 2016年03月31日 21:10
  • 1662

c++弱引用 强引用

原来,我认为“为什么会有引用计数这样的技术”是为了内存自动回收和节省内存,但是读完下面的几节后,内存自动回收是一个原因,但是节省内存并不是真正的原因,真正的原因是有些对象如果被复制在现实中是不合事实的...
  • yyhero1
  • yyhero1
  • 2013年10月17日 22:35
  • 6273

C++11 range for 遍历多维数组, 迭代变量添加引用 "&"的问题

问题背景        auto 是 C++ 11 扩展的新特性,用于自动类型推导。不过,如果你希望推导出的类型为引用(&),就要手动在变量名前加 '&';如果你还需要变量是常量的话,也要手动加入 '...
  • Ace_Yom
  • Ace_Yom
  • 2015年10月08日 09:29
  • 1563

c++ 智能指针及 循环引用问题

c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 de...
  • xtzmm1215
  • xtzmm1215
  • 2015年05月20日 11:46
  • 1651

一个简单的例子让你理解值传递和引用传递

碰到一些做了好几年java开发的程序员还弄不清楚值传递和引用传递的区别,下面通过一个简单的例子来说明:public class Person { private String name; publi...
  • java_zys
  • java_zys
  • 2016年04月20日 16:36
  • 2983

引用折叠和完美转发

如下来分析使用右值引用 + 新增的引用折叠推导规则,如何来达成完美转发 进行转发的函数模板定义如下 其中 WrapFunc 函数模板将参数转发给 InnerFunc 函数 templat...
  • l451800869
  • l451800869
  • 2016年03月10日 14:12
  • 1757
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++11 右值引用简化代码的例子
举报原因:
原因补充:

(最多只允许输入30个字)