日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

c++ remove_reference

作者:四庫全書的酷 更新時間: 2022-05-13 編程語言

文章目錄

  • 作用
    • 源碼
    • 看看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,就會被傳到第二個實現中。
remove_reference ,那么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::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

原文鏈接:https://blog.csdn.net/weixin_46535567/article/details/124693892

欄目分類
最近更新