c++ remove_reference

作用

手册解释如链接

源码

template <typename T>
class remove_reference
{
public:
   typedef T type;
};

template<typename T>
class remove_reference<T&>
{
public:
   typedef T type;
};

看看remove_reference 做了什么?

他封装了一个普通的模板类,并且typedef T type,主要看第二个,封装了一个引用类型的T&
我们使用时remove_reference<decltype(*a)>,就会被传到第二个实现中。
remove_reference<int &> ,那么typedef int type,此时type就会变为int,解除引用

总结:如果模板T被解释为引用类型,就解引用

反例一:在不考虑解引用的情况下。

代码

#include "head.h"
#define MY namespace my{
#define MYEND }

using namespace std;
MY
template <typename T>
void swap(T&& a,T&& b){  //使用右值引用传参,可以传参右值或者左值。
    cout << a << " "<<b<<endl;
    T c = a;
    a = b;
    b = c;
    cout << a << " "<<b<<endl;
    return ;
}
MYEND


int main(){
    int a = 3,b = 4;
    my::swap(a,b);   //左值作为参数
    my::swap(123,234); //右值作为参数
    return 0;
}

结果

3 4
4 4   //不是我们想要的,error
123 234
234 123

分析

main函数中调用swap(a,b)时,模板推到T&& = int&(左值),即T = int&.
此时swap函数中就会变成下面的编译结果:

void swap(int& a,int& b){  //使用右值引用传参,可以传参右值或者左值。
    cout << a << " "<<b<<endl;
    int& c = a;  //即c是a的引用
    a = b;
    b = c;
    cout << a << " "<<b<<endl;
    return ;
}

此时c是a的引用,进行传递值的时候,直接将b赋值给了a和c
这就是为什么产生了3,4经过swap函数变成了4,4

正例:使用解引用

代码

#include "head.h"
#define MY namespace my{
#define MYEND }

using namespace std;
MY
template <typename T>
void swap(T&& a,T&& b){
    //typename remove_reference<T>::type c = a;
    remove_reference_t<T> c = a;  //解引用使用,这里就不是int&c=a;而是int c = a;
    cout << a << " "<<b << endl;
    c = a;
    a = b;
    b = c;
    cout << a << " "<<b << endl;
    return ;
}
MYEND


int main(){
    int a = 3,b = 4;
    my::swap(a,b);

    my::swap(123,234);
    return 0;
}

结果

3 4
4 3
123 234
234 123
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四库全书的酷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值