1. 程式人生 > >(3)左右值再探與decltype

(3)左右值再探與decltype

left 哪些 而是 ++ 但是 是什麽 了解 ati pure

Decltype 類型指示符

“引用從來都作為其所指對象的同義詞出現,只有用在decltype處是一個例外

理解:

Decltype和auto區別:

1. auto是從表達式類型推斷出要定義的變量類型,且用該表達式的值去初始化。而decltype雖然也是從表達式類型推斷要定義的變量類型,但是不會用該表達式的值去初始化

2. decltype的結果類型與表達式形式密切相關(表達式只有變量和表達式不止有變量)

第二點就是理解這裏的關鍵,對於decltype來說,如果表達式是變量名加上括號得到的就是一個引用(加括號的時候編譯器將其視為表達式而不是變量):

Int i=0;

decltype((i))d; //d是一個int引用,必須初始化

decltype(i)d; //d是一個普通的int

因此對於:

Decltype(*p)c //c是一個int&,即引用。

在這裏,引用和*p聯系到了一起,這就是那個例外。

那麽,為什麽會是這樣呢?

此外,為什麽變量加個括號,在decltype中就會返回引用類型呢?

這一切都和區別2和左右值在decltype中的應用有關。

首先我們要明確,decltype中,表達式只有變量不會出現這種差異,變量是什麽就返回什麽;只有在表達式不止是變量時會有不同。

表達式之所以不同,是因為decltype此時是根據表達式的結果來返回對應的類型.那麽表達式的結果有哪些呢?

1.表達式的結果對象能作為一條賦值語句的左值時,decltype返回的是引用類型

想到這,有必要再次深入了解C++中的左右值區別了。之前存的文章:

https://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues

以及最近在看的網絡課筆記:

http://www.cnblogs.com/wuduojia/articles/7635635.html

派上了用場,接下來就是自己試著合起來理解一下。

首先是stack overflow裏高票答案的理解:

一切的原因可能是因為移動時全語義的變化(全語義的意思見網絡課筆記)。一旦我們對表達式進行移動而非復制,很容易就能看出在不同表達式上移動的區別。根據我對草案的理解,我認為rvalue和lvalue的概念和以前一樣,只是在移動時更加細分了這個概念。

為什麽需要它?也許並不是我們想的那樣即定義不一樣了,而是定義的更加精確了而已。

1.lvalue=left value=左值

2.xvalue =expiring value

3.glvalue =generalized lvalue

4.rvalue=right value=右值

5.prvalue =pure rvalue

由於英語差,感覺自己理解的這五種值不對,又去查了資料:

https://www.zhihu.com/question/22111546

https://www.2cto.com/kf/201602/489942.html

發現這些答案應該可以說清楚了,但是很多基礎性的東西還不懂,無法理解!所以決定先放一放,以後再回頭理解!

暫時先按照這篇文章的理解:

http://www.cnblogs.com/wuchanming/p/3751847.html

“使用關鍵字decltype的時候,左值和右值也有所不同。如果表達式的求值結果是左值,decltype作用於該表達式(不是變量)得到一個引用類型。舉個例子,假定p的類型是int* ,因為解引用運算符生成左值,所以decltype(*p)的結果是int&。另一方面,因為解地址運算符生成右值,所以decltype(&p)的結果是int**,也就是說,結果是一個指向整型指針的指針。”

(3)左右值再探與decltype