引用不能绑定到"无物"?
引用不能绑定到"无物"?
在《深度探索C++对象模型》第3.4节中提到:
至于reference,则不需要针对可能的0值做防卫,因为reference不可能参考到“无物”(no object).
但实际上,因为referennce实际上是指针,可以设法将reference设为nullptr
,如下:
#include <iostream> void showAddr(int& ref) { // 打印ref引用得对象的地址 std::cout << static_cast<void*>(&ref) << std::endl; } int main() { showAddr(*static_cast<int*>(nullptr)); }
在g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0上编译输出如下:
0
在stckoverflow的一个帖子上也提到reference是可以绑定到nullptr
的。
- A pointer can be assigned nullptr, whereas a reference must be bound to an existing object. If you try hard enough, you can bind a reference to nullptr, but this is undefined and will not behave consistently.
当然这权当玩笑之作,应该不会有人故意这么干。
引用和指针的区别
正好找到了上面的帖子,学习一下高赞评论总结的引用和指针的区别:
- 指针能重新赋值,但引用不能重新绑定,而且必须在初始化时就绑定;
int x = 5; int *p; // OK p = &x; // OK // int &q; // Error ! int &r = x // OK
-
指针有自己的identity(我理解为指针是一种确切的类型),有确切的、可见的地址,这个地址能使用&(取址符)获得,能用
sizeof
操作符获取其确切的大小;但这些操作符作用于引用身上实际上是对其绑定的对象进行操作,引用的地址和大小也都是不可见的; -
可以使用任意间接级别的指针(可以创建一个pointer,其指向的也是一个pointer,而且可以嵌套任意级别)。但引用只提供一个间接级别(没有引用的引用);
int x = 0; int *p = &x; int **pp = &p; // OK
- 一个指针可以被赋值为
nullptr
,但引用必须绑定到一个存在的对象上。当然,也可以把引用绑定到nullptr,但行为是未定义的; - 指针能遍历一个数组,使用
++
操作符就能令指针指向下一个对象,使用+4
就能指向第五个对象,无论指针指向什么对象; - 指针使用
*
解引用来访问其指向的内存地址,引用可以直接使用。指针指向一个class/struct时,使用->
来访问其成员(变量/函数),而引用使用.
; - 引用不能放到数组中(没有引用的数组,但要注意有数组的引用),而指针可以;
int arr[] = {1,2,3,4,5}; // int& arrOfRef[2] = {arr[0], arr[1]}; // Error ! int (&refToArr)[5] = arr; // OK
const
引用可以绑定到临时对象上,但指针不行。
const int& x = int(12); // OK // int* y = &int(12); // Error !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通