一张表来描述
int | int & | 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 &&只能绑定到右值。