深入篇 decltype深入分析

2021-10-03 15:01:10 字數 4080 閱讀 1361

int

fun();

​int

main

(void

)

double tempa =

3.0;

const

double ctempa =

5.0;

const

double ctempb =

6.0;

const

double

*const cptrtempa =

&ctempa;

/*1.dcltempa推斷為const double(保留頂層const,此處與auto不同)*/

decltype

(ctempa) dcltempa =

4.1;

/*2.dcltempa為const double,不能對其賦值,編譯不過*/

dcltempa =5;

/*3.dcltempb推斷為const double * const*/

decltype

(cptrtempa) dcltempb =

&ctempa;

/*4.輸出為4(32位計算機)和5*/

cout<<

sizeof

(dcltempb)

<<

" "

<<

*dcltempb

dcltempb =

&ctempb;

/*6.保留底層const,不能修改指標指向的物件的值,編譯不過*/

*dcltempb =

7.0;

decltype是為了獲取變數或者表示式的型別而存在,其主要作用是可以獲取引用關聯(&),甚至是為了確認左值!

當decltype(a),a為變數的時候,const int& i = 1;decltype(i)為const int&,即就是變數的型別;

當a為表示式的時候,如果該表示式的值是左值,則返回t&,例如int* p= 1;decltype(*p)為int&,同理deque vector等,deque< int > a; decltype(a)為int&, 因為表示式a可以當左值(deque裡operator的返回值為t&,所以為左值引用型別,必為左值),同理陣列的也是左值,如果class a裡的operator不是左值,是返回int,decltype(a)為int

decltype可以形別推導,例如decltype(auto) 即保證形別與返回值或者=右邊的值得型別完全一致!因為使用函式模板或者auto推導的時候,會去除引用&,decltype可以恢復

這裡首先要區分左值引用、右值引用和左值、右值的關係

int i = 1; int& a = i; 這裡a是左值,其decltype(a)為int&,為左值引用,只能等於左值

int&& b = 1; b為左值,但是其是右值引用,只能等於右值

fun(t&),只能接收左值,不管其型別是左值引用還是右值引用

fun(t&&),如果是萬能引用則左值或者右值都能接收,但是如果確定t為int,則只能接收右值

左值是可以放在等號左邊的,比如*p,或者vector(),是可以被賦值的

右值只能放在等號右邊,比如函式返回值為int,其只能在等號右邊

先複習下函式模板和auto引數推導,auto與fun一致

fun(t a) — 先去除&,const,例子:const int& x, fun(x)為(t為int),為值傳遞

fun(t& a) — x只能為左值,且x要去除引用,例子,const int&& x,則t& a = const int,t為const int,pt為const int& ,x為const int&&,也就是說pt不一定為x,右值形參只能傳右值,不去除&&

fun(t&& a) — 萬能引用,判斷x為左值還是右值

注意函式引數與陣列引數,void fun(int a),如果是第一種,則void()(int),如果是第二種void(&)(int),陣列第一種為int,形參為int(&)[n]

例子1:

vector<

int> a

;auto testa = a[1]

;//a[1]為int&,auto為templatefun(t t) --去除const與&,為int

decltype

(testa)

= a[1]

// a[1]為int&, 左邊為int&

例子2:

這種auto在前的返回值,不代表是auto推導型別,而是佔位,實際推導為decltype(c[i]),這裡為t&

auto authandacess(container& c, index i)->decltype(c[i])
1、t&

template

<

typename container,

typename index>

auto

authandacess

(container& c, index i)

->

decltype

(c[i]

)2、返回的是個右值t,因為auto

-return為函式模板推導,t~t&,結果會去除&,如果authandacess(d,

5)=10;會報錯,因為前面函式返回了右值

template

<

typename container,

typename index>

auto

authandacess

(container& c, index i)

3、c++

14寫法

template

<

typename container,

typename index>

decltype

(auto

)authandacess

(container& c, index i)

)4、完美**版本

template

<

typename container,

typename index>

decltype

(auto

)authandacess

(container&& c, index i)

)

widegt w;

const widget& cw = w;

auto mywidegt = cw;//這時符合auto t模式,值傳遞,const/&都消掉,mywidegt為widegt

decltype

(auto

) mywidegt = cw 為const widegt&

**:

template

<

typename _tp>

struct remove_reference11

};template

<

typename _tp>

struct remove_reference11<_tp&

>};

template

<

typename _tp>

struct remove_reference11<_tp&&

>};

class

testcc

int a;};

testcc cc;

remove_reference11<

decltype

(cc[2]

)> ppp;

//int

int i;

remove_reference11<

decltype

(std::

move

(i))

>

// int&&

vector<

int> t

remove_reference11<

decltype

(t[1])

>

//int&

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...