C++引用和右值引用

C++引用和右值引用

引用的意义

引用是C++的特性,在C++11后,又新增了右值引用,引用的存在是很有必要的,引用主要解决的问题如下。

函数传参问题。

返回值的拷贝问题。

引用已经解决了传参问题和部分返回值拷贝问题,但是还有一部分没有解决,于是C++11就新增了右值引用来解决剩余的部分。

右值引用的移动语义

引用解决了返回值的声明周期大于函数的声明周期的拷贝问题,右值引用解决了返回值的声明周期与函数的声明周期相同的拷贝问题

但是右值引用不是直接解决该问题,而是通过右值引用的移动语义来解决这个问题,在C++11后,新增了更多的默认成员函数,如移动构造,移动赋值等等。

在这种情况下,t1作为临时变量,出作用域就会消失,此时将其通过move 转换为右值,然后返回,则会调用移动构造函数,直接将该临时变量的内容交换到新的变量,减少了对象在构造时的时间开销,当然移动构造对深拷贝对象有很好的降低时间复杂度的效果。

在C++11后,STL接口中很多都增加了右值引用版本。

新的默认成员函数,移动构造,移动赋值等,它们会收到如析构函数,拷贝构造,赋值等函数,如果显示写了上面的函数,则默认的移动构造,移动赋值都不会生成。

右值引用的属性

引用的属性是左值,很多人认为右值引用的属性是右值,但这是错的,右值引用虽然引用右值,但是其属性确实左值。

所以在我们进行函数传参是,参数接收一个右值引用,在函数内若使用该参数,则该参数会被解释为左值,本来用户想调用右值函数,但是实际上调用的确实左值函数,为了解决该问题有以下两个方法。

1.增加move将左值转换为右值。

2.使用完美转发。

完美转发是一个C++11提供的接口,可以实现该值穿进来是什么值,使用的时候就是什么值。

右值引用的属性是左值,那么左值引用能否引用右值呢?
const 左值引用可以引用右值 ,在没有右值引用前,若一个左值函数要接收一个右值,则需要加入const。
右值引用也可以引用左值,move将左值转换为右值。

C++11新特性万能引用

万能引用是一个模板,该模板接收不论右值,还是左值,还是const左值,还是const右值,都可以传入该模板中,让其生成函数。

万能引用模板如上,如果传入右值,则T&& 被解读为 T&&,如果传入左值,则T&& 被解读为 T& ,const同理。

万能引用的出现让模板的可复用性增加了,减少了程序员的代码量,但是可读性变差了。

相关推荐
楼田莉子18 小时前
C++算法专题学习:栈相关的算法
开发语言·c++·算法·leetcode
IvanCodes18 小时前
六、Docker 核心技术:Dockerfile 指令详解
java·数据库·docker
dragoooon3418 小时前
[数据结构——lesson3.单链表]
数据结构·c++·leetcode·学习方法
Suresoft China18 小时前
软件测试|STATIC 代码静态验证工具 C/C++ 工具链设置指南
c++·单元测试·静态测试·测试覆盖率·static·代码覆盖率·工具链设置
_oP_i18 小时前
Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题
java·开发语言
kyle~18 小时前
排序---冒泡排序(Bubble Sort)
c语言·c++·算法
用户94468140135018 小时前
部分替代Lombok?不可变数据的载体?一篇文章带你了解JDK16正式引用的record类型!
java
用户03321266636718 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java
轮到我狗叫了18 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
渣哥18 小时前
你遇到过 ConcurrentModificationException 吗?其实很常见
java