C++ constexpr auto 類型別名
常量表達(dá)式(const expression)是指值不會(huì)改變且在編譯過程就能得到結(jié)果的表達(dá)式。用常量表達(dá)式初始化的const對(duì)象也是常量表達(dá)式。

盡管sz是一個(gè)常量,但是他的值在具體運(yùn)行時(shí)才能得到,所以不是常量表達(dá)式。
constexpr變量
在一個(gè)復(fù)雜系統(tǒng)中我們基本很難確定一個(gè)初始值到底是不是常量表達(dá)式,c++11新標(biāo)準(zhǔn)規(guī)定(指的c++ primer第五版的標(biāo)準(zhǔn))允許將變量聲明為constexpr類型以便由編譯器來驗(yàn)證變量是否是一個(gè)常數(shù)表達(dá)式。聲明為constexpr的變量一定是一個(gè)常量,而且必須用常量表達(dá)式初始化。

盡管不能使用普通函數(shù)作為constexpr變量的初始值,但是后面我們將介紹一種新標(biāo)準(zhǔn)允許定義一種特殊的constexpr函數(shù)。
字面值類型
常量值表達(dá)式的值需要在編譯時(shí)就得到計(jì)算,因此對(duì)聲明constexpr就有所限制,我們將他稱為“字面值類型”
到目前為止算術(shù)類型、引用和指針都屬于字面值類型。自定義的類不屬于字面值類型,也就不能被定義為constexpr,在比較后面我們還會(huì)介紹一些字面值類型。
盡管指針和引用都能定義為constexpr,但是他們的初始值都受到嚴(yán)格的限制,一個(gè)constexpr指針的初始值必須是nullptr或者0,或者是儲(chǔ)存某個(gè)固定地址中的對(duì)象。
后面我們會(huì)提到,函數(shù)體內(nèi)定義變量一般來說并非存放在固定地址中,因此constexpr指針不能指向這樣的變量,相反函數(shù)體之外的對(duì)象地址固定不變,因此可以用來初始化constexpr指針。往后我們還將詳細(xì)講述允許函數(shù)定義一類有效范圍超出函數(shù)本身的變量,這類變量、也有固定地址。
指針和constexpr
如果constexpr定義了一個(gè)指針,那么constexpr只對(duì)指針有效。

這里q和p相差甚遠(yuǎn),關(guān)鍵字constexpr把他所定義的對(duì)象置為了頂層const。
與其他常量指針類似,constexpr指針既可以指向常量也可以指向非常量。

類型別名
類型別名可以讓復(fù)雜的名稱變得簡單。有兩種定義類型別名的方法。
1關(guān)鍵字typedef

2新標(biāo)準(zhǔn)定了一種新方法,使用別名聲明來定義。

using關(guān)鍵字將左側(cè)的名字規(guī)定成右側(cè)類型的別名。
指針、常量和類型別名
如果某個(gè)類型別名指代的是復(fù)合類型或常量,那么將他用到聲明語句就會(huì)產(chǎn)生意想不到的后果。

const是對(duì)給定類型的修飾,pstring實(shí)際上是指向char的指針,因此const pstring就是指向char的常量指針,而非指向常量字符的指針。
注意:聲明語句中用到pstring時(shí),其基本數(shù)據(jù)類型時(shí)指針,可是改寫成char*后,數(shù)據(jù)類型就變成了char,*成了聲明符的一部分,這樣const char就成了基本數(shù)據(jù)類型。所以pstring時(shí)一個(gè)指向char的常量指針,而const char*就是一個(gè)指向const char的指針。
auto類型說明符
auto類型能讓編譯器替我們?nèi)ヅ袛啾磉_(dá)式屬于的類型,因此auto必須有初始值。

auto一條聲明語句只能有一個(gè)類型

復(fù)合類型、常量和auto

auto一般會(huì)忽略頂層const,同時(shí)保留底層const

如果希望auto推斷出頂層const,需要明確指明

設(shè)置一個(gè)auto的引用時(shí),初始值中的頂層const依舊保留。

要在一條語句中定義多個(gè)變量,&和*只從屬于某個(gè)聲明符而非基本類型的一部分,因此初始值必須時(shí)同一類型

(確實(shí)難定,有點(diǎn)遭不住了