C++ remove_reference(引用移除)

本文探讨了C++中的`remove_reference`模板,它用于解除引用类型。通过示例代码展示了`remove_reference`如何在变量赋值后改变值的行为,揭示了引用与普通变量在内存存储上的差异。理解这一概念对于深入理解C++的引用特性和内存管理至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值