IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ remove_reference -> 正文阅读

[C++知识库]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
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:47:23  更:2022-05-14 09:48:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:22:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码