/*##################################################################
* 右值引用 (C++ 11)
* 主要用于以下:
* 1. 移动语义
* 2. 完美传参 Perfect Forwarding
*/ /*
* 什么是右值引用?
*/ int a = 5;
int& b = a; // b是左值引用,在C++ 03叫做引用 int&& c // c 右值引用 void printInt(int& i) { cout << "lvalue reference: " << i << endl; }
void printInt(int&& i) { cout << "rvalue reference: " << i << endl; } int main() {
int i = 1;
printInt(i); // 调用第1个printInt
printInt(6); // 调用第2个printInt printInt(std::move(i)); // i是左值,先调move(),再调第2个printInt
} /*
* 函数签名:
*
* int和int&不区分
* int和int&&不区分
*
* int&和int&&区分,也就是可以重载左值引用和右值引用两个
*/ /* What's the big deal??? */ class boVector {
int size;
string label;
double* array;
public:
boVector(const boVector& rhs) { // 拷贝构造
size = rhs.size;
array = new double[size];
for (int i=0; i<size; i++) { array[i] = rhs.array[i]; }
}
// boVector(const boVector&& rhs) { // 移动构造
// size = rhs.size;
// array = rhs.array;
// rhs.array = nullptr;
// }
};
void foo_by_value(boVector v) { v.label = "Student's Ages"; } //如果没有右值引用,需要很多不同版本的函数
void foo_by_reference(boVector& v) { v.label = "Student's Ages"; }
boVector createBoVector(); // Creates a boVector void main() {
boVector reusable = createBoVector();
foo_by_value(reusable);
...
boVector tmp= createBoVector();
foo_by_reference(tmp);
} /* Notes:
boVector(const boVector&& rhs) { // 移动构造
size = rhs.size;
array = rhs.array;
} boVector reusable = createBoVector();
foo(reusable);
*/ // 练习:
boVecotor b = createBoVector(); // Approach 1:
void foo(boVector & v);
foo(b); // Approach 2:
void foo(boVector && v);
foo(std::move(b)); // 问题:两种方法的相同点和不同点
// 两者参数传递上都不需要深拷贝
// 后者将所有权也传递, move后不能再使用 /*
* Note 1: 右值引用最主要的使用地方是重载拷贝构造和拷贝赋值,得到移动语义
*/
X& X::operator=(X const & rhs);
X& X::operator=(X&& rhs); /* Note 2: 所以得STL容器都实现了移动语义,这意味着:
* a. 只要切换到C++ 11,代码不做任何改变程序就能变快
* b. 使用值传递的频率更高了
*/ vector<int> foo() { ...; return myvector; } //可以直接返回 void goo(vector<int>& arg); // 当需要使用参数将goo中处理之后的数据带回外面,需要用引用传递 /* 移动构造:
* 目的:避免不必要的深拷贝
* 1. 当既需要传引用又需要传值得时候,移动构造很有用
* 2. 移动构造允许你对移动对象那个部分进行细微的控制
*/ // 陷阱:右值引用是一个右值么? boVector(const boVector && rhs) {
cout << "Move constructor.\n";
size = rhs.size;
array = rhs.array;
overload(rhs);
} overload(boVector& v) { cout << "by lvalue."; }
overload(boVector&& v) { cout << "by rvalue."; }

C++11--右值引用(移动语义)的更多相关文章

  1. 关于C++11右值引用和移动语义的探究

    关于C++11右值引用和移动语义的探究

  2. C++11右值引用

    [C++11右值引用] 1.什么是左值?什么是右值? 左值是表达式结束后依然存在的对象:右值是表达式结束时就不再存在的对象. 2.std::move的作用是什么? std::move用于把任意类型转化 ...

  3. C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  4. C++11 右值引用 与 转移语义

    新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...

  5. c++11 右值引用和移动语义

    什么是左值.右值 最常见的误解: 等号左边的就是左值,等号右边的就是右值 左值和右值都是针对表达式而言的, 左值是指表达式结束后依然存在的持久对象 右值是指表达式结束时就不再存在的临时对象区分: 能对 ...

  6. [c++11]右值引用、移动语义和完美转发

    c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...

  7. C++ 11 右值引用

    C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L ...

  8. C++ 11 右值引用以及std::move

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/46779063 新类型: int和int&是什么?都是类型.int是整数类型,in ...

  9. 【转】C++ 11 右值引用的理解

    右值引用的目的之一,是为了C++中一个比较影响性能的问题:拷贝临时对象,例如,在 int foo(){ ... } int x; x = foo(); 中,在第三句中,发生了以下的事情: 1.销毁 x ...

  10. C++11右值引用和std::move语句实例解析

    关键字:C++11,右值引用,rvalue,std::move,VS 2015 OS:Windows 10 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一.从实践 ...

随机推荐

  1. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  2. [LeetCode&Python] Problem 705. Design HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...

  3. P2261 [CQOI2007]余数求和 (数论)

    题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...

  4. 20155208实验三 敏捷开发与XP实践

    20155208实验三 敏捷开发与XP实践 一.实验内容 (1)在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最 ...

  5. C语言--第一周作业评分和总结(5班)

    作业链接:https://egdu.cnblogs.com/campus/hljkj/CS2017-5/homework/963 一.评分要求 * 要求1 (5分):博客中给出安装软件的截图(得分点1 ...

  6. 矩阵快速幂(以HDU1757为例)

    对于数据量大的求余运算,在有递推式的情况下,可以构造矩阵求解. A - A Simple Math Problem Lele now is thinking about a simple functi ...

  7. 03 事务,连接池DBCP,C3P0,DBUtils

    事务 Transaction  其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回归到最初的状态(回滚) 事务的作用:为了确保逻辑的成功. 例子: ...

  8. 《DSP using MATLAB》Problem 5.15

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  9. python中的print函数

    python3.x中将print由一个声明转变成了一个函数. 官方说法: Converts the print statement to the print() function. print(*ob ...

  10. Xenserver之HA实现-NFS的实现

    环境: 在vm上安装好一台Xenserver服务器,一台centos7虚拟机(用来做NFS存储,因为实现HA需要共享存储),网络连接方式为桥接模式 echo '- - -'>> /sys/ ...