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

汇编中可以看出,去引用后,是在栈中的一块内存存储实际对象值,而不是和引用一样(栈中内存只存储的元对象的一个地址)

经验分享 程序员 微信小程序 职场和发展