首页 > 其他分享 >引用不能绑定到"无物"?

引用不能绑定到"无物"?

时间:2022-10-24 22:13:38浏览次数:72  
标签:无物 OK int 绑定 nullptr 引用 指针

引用不能绑定到"无物"?

在《深度探索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的。

  1. 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.

当然这权当玩笑之作,应该不会有人故意这么干。

引用和指针的区别

正好找到了上面的帖子,学习一下高赞评论总结的引用和指针的区别:

  1. 指针能重新赋值,但引用不能重新绑定,而且必须在初始化时就绑定;
int x = 5;
int *p;     // OK
p = &x;     // OK

// int &q;  // Error !
int &r = x  // OK
  1. 指针有自己的identity(我理解为指针是一种确切的类型),有确切的、可见的地址,这个地址能使用&(取址符)获得,能用sizeof操作符获取其确切的大小;但这些操作符作用于引用身上实际上是对其绑定的对象进行操作,引用的地址和大小也都是不可见的;

  2. 可以使用任意间接级别的指针(可以创建一个pointer,其指向的也是一个pointer,而且可以嵌套任意级别)。但引用只提供一个间接级别(没有引用的引用);

int x = 0;
int *p = &x;
int **pp = &p; // OK
  1. 一个指针可以被赋值为nullptr,但引用必须绑定到一个存在的对象上。当然,也可以把引用绑定到nullptr,但行为是未定义的;
  2. 指针能遍历一个数组,使用++操作符就能令指针指向下一个对象,使用+4就能指向第五个对象,无论指针指向什么对象;
  3. 指针使用*解引用来访问其指向的内存地址,引用可以直接使用。指针指向一个class/struct时,使用->来访问其成员(变量/函数),而引用使用.
  4. 引用不能放到数组中(没有引用的数组,但要注意有数组的引用),而指针可以;
int arr[] = {1,2,3,4,5};
// int& arrOfRef[2] = {arr[0], arr[1]}; // Error !
int (&refToArr)[5] = arr; // OK
  1. const引用可以绑定到临时对象上,但指针不行。
const int& x = int(12);  // OK
// int* y = &int(12);       // Error !

标签:无物,OK,int,绑定,nullptr,引用,指针
From: https://www.cnblogs.com/lycpp/p/16823184.html

相关文章

  • dellphi Tcxgrid 引用双击事件
      我设置了一个双击事件,然后又想通过右键菜单来实现双击整事件里的功能,就这么一个简单的功能,我卡了一天!主要卡在ACellViewInfo这个参数里面,想传这个参数进去,......
  • el-select v-model绑定为对象时,value-key的个人理解
    先看代码示例:<template><el-selectv-model="media"value-key="id"placeholder="请选择"@change="mediaChange"><el-optionv-for="iteminmedias":k......
  • Vue+el-select v-model绑定为对象时回显失效的问题探究
    源代码如下:<template><el-selectv-model="media"value-key="mediaId"placeholder="请选择"@change="mediaChange"><el-optionv-for="iteminmedias"......
  • Xamarin.Forms 绑定数据
    一、如何绑定后台数据?通过写一个类去继承一个INotifyPropertyChange接口实现接口   使用构造函数给这个属性赋初始值,给页面初始化的时候展示,使用双向绑定 还......
  • C++之值传递&指针传递&引用传递详解
    C++之值传递&指针传递&引用传递详解目录C++之值传递&指针传递&引用传递详解1.函数基础2.值传递3.指针传递4.引用传递1.函数基础一个函数由以下四部分组成:返回类型函......
  • Jmeter-2.定义变量与引用变量
    1.定义变量在测试计划中  2.引用变量时使用${}进行引用 ......
  • 【转】VUE2 表格绑定
    资料及内容来自黑马程序员点击下载代码片断:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge">......
  • WPF绑定ViewModel方式
    一、xaml方式绑定ViewModel在MainWindow.xaml文件中,引入ViewModel对应的命名空间在MainWindow.xaml文件中,添加窗口上下文节点绑定ViewModel,如下图:二、代码方式绑定Vi......
  • 方法引用与构造器引用
    方法引用(MethodReferences)当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表......
  • 【JavaScript】事件的冒泡,委派,绑定和传播
    文章目录​​冒泡事件​​​​特性:​​​​阻止冒泡事件的两种方法​​​​cancelBubble​​​​stopPropagation()​​​​委派事件​​​​特性​​​​获取点击的元素​......