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*5.保留頂層const,不能修改指標指向的物件,編譯不過*/
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...