網站首頁 編程語言 正文
文章目錄
- 什么是左值?
- 什么是右值?
- 左值引用與右值引用比較
- 右值引用使用場景和意義
什么是左值?
左值是一個表示數據的表達式(如變量名或解引用的指針),我們可以獲取它的地址+可以對它賦
值,左值可以出現賦值符號的左邊,右值不能出現在賦值符號左邊。定義時const修飾符后的左
值,不能給他賦值,但是可以取它的地址。左值引用就是給左值的引用,給左值取別名。
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;
}
什么是右值?
右值也是一個表示數據的表達式,如:字面常量、表達式返回值,函數返回值(這個不能是左值引
用返回)等等,右值可以出現在賦值符號的右邊,但是不能出現出現在賦值符號的左邊,右值不能
取地址。右值引用就是對右值的引用,給右值取別名。
double fmin(double x, double y)
{
return x < y ? x : y;
}
int main()
{
double x = 1.1, 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;
}
總結:
右值相較于左值的特點:不能被取地址
左值引用與右值引用比較
左值引用總結
- 左值引用只能引用左值,不能引用右值。
- 但是const左值引用既可引用左值,也可引用右值。
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;
}
右值引用總結
- 右值引用只能右值,不能引用左值。
- 但是右值引用可以move以后的左值。
int main()
{
// 右值引用只能右值,不能引用左值。
int&& r1 = 10;
int a = 10;
int&& r2 = a;// message : 無法將左值綁定到右值引用
// 右值引用可以引用move以后的左值
int&& r3 = std::move(a);
return 0;
}
右值引用使用場景和意義
這種方式會造成資源的浪費:str等to_string調用完畢后生命周期結束,會調用析構函數,釋放空間
如果能夠將str所指向的空間直接給ret1,就不會造成資源的浪費,這就是右值引用的意義
// 移動構造
string(string&& s)
:_str(nullptr)
,_size(0)
,_capacity(0)
{
swap(s);
}
如果string提供了上述函數,再次調用to_string時,就會發生移動構造
原文鏈接:https://blog.csdn.net/zjq_love/article/details/126978649
相關推薦
- 2022-05-22 Flutter應用框架搭建之屏幕適配詳解_Android
- 2022-03-31 C#實現溫度轉換功能_C#教程
- 2022-03-10 通過容器擴展屬性IExtenderProvider實現WinForm通用數據驗證組件_C#教程
- 2022-04-27 解決linux下redis數據庫overcommit_memory問題_Redis
- 2022-09-06 C#任務并行Parellel.For和Parallel.ForEach_C#教程
- 2022-08-15 常見哈希算法、Hmac算法和BouncyCastle
- 2023-01-02 C#中static的詳細用法實例_C#教程
- 2023-02-14 React?useCallback使用教程_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支