C++ remove_reference(引用移除)
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 ",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 ",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
汇编中可以看出,去引用后,是在栈中的一块内存存储实际对象值,而不是和引用一样(栈中内存只存储的元对象的一个地址)