版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxc024000/article/details/80753090
C++11右值引用
- 最近做的某个项目,由于与国外的某些东西有关。接触到很多C++11、C++14的语法。一方面不时惊叹居然能这么写,另一方面觉得国外的技术确实比国内的发达,至少很多国内觉得新的技术,国外已经应用了许久了。
左值与右值
- 左值:可以简单理解为,能用在等号左边,也能用在等号右边的值。
- 右值:可以简单理解为,只能用在等号右边的值。
// 变量a是个左值, 字面量10是个右值。
int a = 10;
// 函数返回值是个左值
int x;
int& getL()
{
return x;
}
// 函数的返回值,也可以是个右值
int getR()
{
int y = 10;
return y;
}
- 总结:进一步的理解,可以为:
左值:拥有相对稳定的内存,内容可修改(非const)。并且这块内存的内容可反复使用的值。
右值:拥有不稳定的内存,内容不可修改。一般来讲,在使用后该内存即被释放的值(不能反复使用)。
左值引用与右值引用
- 左值引用:很常见,其实就是C++常说的引用类型
int a = 10;
// 左值引用
int& b = a;
// 形参为左值引用
void fun(int& a)
{
// somd code
}
- 为什么要存在右值引用?
关于这个问题,在知乎上看到过一个比较经典的解释,大概是:
如何把大象从冰箱A放到冰箱B中?
C++:首先,打开冰箱A;启动量子复制程序,复制大象,生成克隆大象。
打开冰箱B。启动量子复制程序,复制克隆大象,将其复制到冰箱B中。
然后,启动销毁程序,清除掉克隆大象。
上述过程,类似C++如下代码
int a = 10;
int b = a;
- 右值引用:使用右值引用,可以避免上述问题所产生的不必要的开销,
// 如果用g++编译,请加上 -std=c++1
// 右值引用
int&& rv = 10;
int b = rv;
// 函数返回右值引用
int&& getRvalueInt()
{
return std::move(b);
}
- 右值引用:C++11加入了右值引用后,导致类中新增了转移构造函数,这一概念。
Class A
{
public:
A() {}
// 拷贝构造函数
A(const A& other) {}
// 转移构造函数
// 其实,就是把other,当作右值来用,减少了额外的开销
A(A&& other) {}
private:
int* m_Array;
}
- 右值引用还有很多的用法,以及延伸知识,网上有很多资料,可以深入了解。