你是否在写函数参数时,纠结该用 int& 还是 int&&?🤔
你是不是也曾被左值、右值、引用、&&这些名词搞得一头雾水?🤯
别担心,其实搞清楚它们比你想象的容易得多!
今天我们不谈复杂的移动语义、不聊完美转发,只专注一点:理解引用本身的本质与用法。🚀
什么是引用?🔁
引用就是给某个对象起个别名,让我们可以用另一个名字来操作它。
想象你把a这个变量也叫小A,你叫谁都能改那个变量的值。
引用的几个小特点:
- 必须立即绑定对象,绑定后就不能换了 🪢
- 不占独立内存,它只是别名,不是副本 📛
- 使用上更简洁,不像指针要到处解引用 ✨
C++ 中有两种引用:
- 👉 左值引用
T&:绑定持久存在、有名字的变量(左值) - 👉 右值引用
T&&:绑定临时的、没名字的值(右值)
对左值与右值傻傻分不清的小伙伴可以看下这篇~
左值引用(Lvalue Reference)🧲
左值引用是 C++ 的传统艺能,用得最多。
🎯 特点总结:
- 只能绑定到左值(变量、数组元素等)
- 可以通过引用修改原对象
- 非常适合函数参数、返回值的引用传递
📌 例子:
int a = 10;
int& ref = a;
ref = 20;
💬 ref 是 a 的别名,改 ref 就是改 a。
🧪 看下地址:
std::cout << "&a = " << &a << "\n";
std::cout << "&ref = " << &ref << "\n";
输出的地址是一样的,说明它们指向同一个东西:
&a = 0x7ffeb3420e0c
&ref = 0x7ffeb3420e0c
右值引用(Rvalue Reference)⚡️
右值引用是 C++11 才引入的新能力,能绑定到临时对象。
它是进行资源优化(比如避免拷贝)的关键工具。
🎯 特点总结:
- 只能绑定右值(临时的、没名字的东西)
- 绑定后会延长临时对象的生命周期 ⏳
- 常配合
std::move()使用
📌 示例:
int&& rref = 10;
rref = 20;
std::cout << "rref = " << rref << "\n";
std::cout << "&rref = " << &rref << "\n";
🌟 虽然 10 是个右值,但通过右值引用 rref,我们接管了它,还能访问它的地址
这里说的访问,是通过右值引用间接访问,想要直接访问右值的地址是不行的
左值引用 vs 右值引用 📋
| 特性 | 左值引用 T& 🧷 | 右值引用 T&& 🔗 |
|---|---|---|
| 可绑定对象 | 左值(有名对象) | 右值(临时值) |
| 是否可修改 | ✅ | ✅ |
| 是否延长生命周期 | ❌ | ✅(绑定后延长) |
| 应用场景 | 参数传递、可修改返回 | 临时对象处理、资源优化 |
| 能否绑定右值 | ❌(除非 const) | ✅ |
注意事项⚠️
-
引用一旦绑定,就不能再指向别的对象了 ❌
-
右值引用变量本身是左值!(因为它有名字)
int&& rref = 10; int& lref = rref; // 合法,rref 是左值
🎯 小结
引用在 C++ 中是连接变量和内存世界的桥梁 🌉:
-
左值引用帮我们操作已有变量
-
右值引用帮我们接管临时对象
希望本文让你对引用有更加清晰的理解~😉
本文首发于微信公众号《Linux在秋名山》,欢迎大家关注~

761

被折叠的 条评论
为什么被折叠?



