C++ remove_reference(引用移除)
demo代码
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
int val = 5;
int& valRef = val;
int& temp = valRef;
valRef = 6;
printf("valRef:%d val:%d temp:%d \n",valRef,val,temp);
int valR = 5;
int& valRefR = valR;
remove_reference<int&>::type tempR = valRefR;//valRefR认为是引用
valRefR = 6;
printf("valRef:%d val:%d tempR:%d \n",valRefR,valR,tempR);
return 0;
}
结果
Hello World!
valRef:6 val:6 temp:6
valRef:6 val:6 tempR:5
由结果可以猜测remove_reference是将引用的关系给解除掉
9 [1] int val = 5;
0x401694 <+0x003b> c7 45 e4 05 00 00 00 mov DWORD PTR [ebp-0x1c],0x5
10 [1] int& valRef = val;
0x40169b <+0x0042> 8d 45 e4 lea eax,[ebp-0x1c]
0x40169e <+0x0045> 89 45 f4 mov DWORD PTR [ebp-0xc],eax
11 [1] int& temp = valRef;
0x4016a1 <+0x0048> 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
0x4016a4 <+0x004b> 89 45 f0 mov DWORD PTR [ebp-0x10],eax
12 [1] valRef = 6;
0x4016a7 <+0x004e> 8b 45 f4 mov eax,DWORD PTR [ebp-0xc]
0x4016aa <+0x0051> c7 00 06 00 00 00 mov DWORD PTR [eax],0x6
17 [1] int valR = 5;
0x4016d5 <+0x007c> c7 45 e0 05 00 00 00 mov DWORD PTR [ebp-0x20],0x5
18 [1] int& valRefR = valR;
0x4016dc <+0x0083> 8d 45 e0 lea eax,[ebp-0x20]
0x4016df <+0x0086> 89 45 ec mov DWORD PTR [ebp-0x14],eax
19 [1] remove_reference<int&>::type tempR = valRefR;//区别
0x4016e2 <+0x0089> 8b 45 ec mov eax,DWORD PTR [ebp-0x14]
0x4016e5 <+0x008c> 8b 00 mov eax,DWORD PTR [eax]
0x4016e7 <+0x008e> 89 45 e8 mov DWORD PTR [ebp-0x18],eax
20 [1] valRefR = 6;
0x4016ea <+0x0091> 8b 45 ec mov eax,DWORD PTR [ebp-0x14]
0x4016ed <+0x0094> c7 00 06 00 00 00 mov DWORD PTR [eax],0x6
汇编中可以看出,去引用后,是在栈中的一块内存存储实际对象值,而不是和引用一样(栈中内存只存储的元对象的一个地址)