引用的一些赋值的问题

一张表来描述

intint &int &&const int&const int &&字面量
int
int &×××
int &&×××××
const int&
const int &&×××××

上述表格都是把行中的类型赋值到列中的类型,一列一列的来,分别编号为1-30:

1.int赋值给int,没什么好说的,肯定可以。

2.int赋值给int &,可以,也没什么好说的。

3.int赋值给int&&。不可以,因为int &&只能绑定到右值。

4.int 赋值给const int &,可以,没什么好说的。

5.int赋值给const int&&。不可以,因为const int &&只能绑定到右值。

6.int&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对int&没有影响。

7.int&赋值给int&,可以。上个汇编看看:

    int a = 10;
00D0461A  mov         dword ptr [a],0Ah  
	int &b = a;
00D04621  lea         eax,[a]  
00D04624  mov         dword ptr [b],eax  
	int &e = b;
00D04627  mov         eax,dword ptr [b]  
00D0462A  mov         dword ptr [e],eax 

直接把b复制给e,指针的赋值嘛。

8.int&赋值给int&&,不可以,因为int &&只能绑定到右值。

9.int&赋值给const int&,可以,汇编代码和7中的一模一样。

10.int&赋值给const int&&。不可以,因为const int &&只能绑定到右值。

11.int&&赋值给int,可以,和int&复制给int一样,也是值拷贝。

12.int&&赋值给int&,可以,没啥好奇怪的,因为int&&说到底还是左值嘛。

13.int&&赋值给int&&。不可以,因为int &&只能绑定到右值,int&&说到底还是左值。

14.int &&赋值给const int &,可以,理由和12一样。

15.int&&赋值给const int&&。不可以,理由和13一样。

16.const int&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对const int&没有影响。

17.const int&赋值给int&,这个不可以,但是用强制类型转换也能赚

18.const int&赋值给int&&,不可以,因为int &&只能绑定到右值。

19.const int&赋值给const int&,可以,汇编代码和7中的一模一样。

20.const int&赋值给const int&&。不可以,因为const int &&只能绑定到右值

21.const int&&赋值给int,可以,只是把值拷贝出去,如果对int进行修改,对const int&&没有影响。

22.const int&&赋值给int&,这个不可以,但是用强制类型转换也能转

23.const int&&赋值给int&&,不可以,因为int &&只能绑定到右值。

24.const int&&赋值给const int&,可以,汇编代码和7中的一模一样。

25.const int&&赋值给const int&&。不可以,因为const int &&只能绑定到右值。

26.字面量赋值给int,没什么好说的。

27.字面量赋值给int&,这个不可以,因为字面量是右值。

28.字面量赋值给int&&,可以,是右值,贴个汇编代码。

int &&b = 10;
006B4621  mov         dword ptr [ebp-30h],0Ah  
006B4628  lea         eax,[ebp-30h]  
006B462B  mov         dword ptr [b],eax  

29.字面量赋值给const int&,可以,贴个汇编代码看看。

const int &c = 10;
006B462E  mov         dword ptr [ebp-48h],0Ah  
006B4635  lea         eax,[ebp-48h]  
006B4638  mov         dword ptr [c],eax 

可以看到和28中的没啥区别,但为什么字面量可以初始化const int&类型,猜测是因为这种类型同时具备底层和顶层const吧,这样的好处就是,不管是指针的指向还是指针的值都不能改变,更加安全。而int&只有顶层const,指针指向的值可以改变。

30.字面量赋值给const int&&。不可以,因为const int &&只能绑定到右值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值