小工具知识网

当前位置: 首页 > 行业知识 > 【C++航海王:追寻罗杰的编程之路】C++11(二)

行业知识

【C++航海王:追寻罗杰的编程之路】C++11(二)

2026-11-03 23:10:52 来源:互联网转载

目录

C++11(上)

1 -> STL中的一些变化

2 -> 右值引用和移动语义

2.1 -> 左值引用和右值引用

2.2 -> 左值引用与右值引用比较

2.3 -> 右值引用使用场景与意义

 2.4 -> 右值引用引用左值及其更深入的使用场景分析

2.5 -> 完美转发


C++11(上)

1 -> STL中的一些变化

新容器

圈起来的是C++11中的一些几个新容器,但是实际最有用的是unordered_map和

unordered_set。

容器中的一些新方法

如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得

比较少的。

比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是

可以返回const迭代器的,这些都是属于锦上添花的操作。

实际上C++11更新后,容器中增加的新方法最后用的插入接口函数的右值引用版本:

std::vector::emplace_back

std::vector::push_back

std::map::insert

std::map::emplace

2 -> 右值引用和移动语义

2.1 -> 左值引用和右值引用

传统的C++语法中就有引用的语法,而C++11中新增的右值引用语法特性。无论左值引用还是右值引用,都是给对象取别名。

那么什么是左值?什么是左值引用呢?

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号的左边。定义时const修饰符后的左值,不能给他赋值,但是可以取地址。左值引用就是给左值的引用,给左值取别名。

#define  _CRT_SECURE_NO_WARNINGS 1#include using namespace std;int main(){// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;return 0;}

那么什么是右值?什么是右值引用呢?

右值也是一个表示数据的表达式,如:字面常量、表达式返回值、函数返回值等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。右值引用就是对右值的引用,给右值取别名。

#define  _CRT_SECURE_NO_WARNINGS 1#include using namespace std;int main(){double x = 1.1;double y = 2.2;// 以下几个都是常见的右值//10;//x + y;//fmin(x, y);// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);// 这里编译会报错:error C2106: “=”: 左操作数必须为左值//10 = 1;//x + y = 1;//fmin(x, y) = 1;return 0;}

需要注意的是右值是不能取地址的,但是给右值取别名后,会导致右值被存储到特定位置,且可

以取到该位置的地址,也就是说例如:不能取字面量10的地址,但是rr1引用后,可以对rr1取地

址,也可以修改rr1。如果不想rr1被修改,可以用const int&& rr1 去引用。

#define  _CRT_SECURE_NO_WARNINGS 1#include using namespace std;int main(){double x = 1.1;double y = 2.2;int&& rr1 = 10;const double&& rr2 = x + y;rr1 = 20;// 报错rr2 = 5.5;return 0;}

2.2 -> 左值引用与右值引用比较

左值引用总结:

  1. 左值引用只能引用左值,不能引用右值。
  2. const左值引用既可引用左值,也可引用右值。
#define  _CRT_SECURE_NO_WARNINGS 1#include using namespace std;int main(){// 左值引用只能引用左值,不能引用右值。int a = 10;int& ra1 = a; // ra为a的别名//int& ra2 = 10;   // 编译失败,因为10是右值// const左值引用既可引用左值,也可引用右值。const int& ra3 = 10;const int& ra4 = a;return 0;}

右值引用总结:

  1. 右值引用只能引用右值,不能引用左值。
  2. 右值引用可以move以后的左值。
#define  _CRT_SECURE_NO_WARNINGS 1#include using namespace std;int main(){// 右值引用只能右值,不能引用左值。int&& r1 = 10;// error C2440: “初始化”: 无法从“int”转换为“int &&”// message : 无法将左值绑定到右值引用int a = 10;int&& r2 = a;// 右值引用可以引用move以后的左值int&& r3 = std::move(a);return 0;}

2.3 -> 右值引用使用场景与意义

之前也有看到左值引用既可以引用左值也可以引用右值,那么C++11为什么还要提出右值引用呢?是不是在画蛇添足呢?下面来看看左值引用的短板,右值引用又是如何补齐短板的

namespace fyd{class string{public:typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}string(const char* str = ""):_size(strlen(str)), _capacity(_size){//cout 

上一篇:日本服务器失败怎么办理?

下一篇:阿里云ECS宝塔面板安装详解