關於在C++ Primer一書中 「const是頂層的」的問題?
如下圖所示,這裡是否如我想的應該是「const是底層的」而非「const是頂層的」
我買的版本是下圖所示的,不知道有沒有新版本修訂了這個錯誤,還是說我自己理解錯了書是對的?
有一個特別簡單的方法來區分頂層和底層const,當你學了模板之後,你可以定義一個
template&
using ptr = T*;
那麼const ptr&
ptr&
頂層這個意思是從AST的角度來講的。const int的節點是const&
const 就是頂層的,書上沒有錯。
所謂底層只會出現在指針和引用當中,其他的一律是頂層(這樣是不是好理解了呢)。
底層const只有在指針還有引用裡面有。
頂層const指的是變數作為數據類型本身的屬性,不論是基本類型還是指針const int ci //int const ci
int * const cpi這兩個的const修飾的都是變數
而const int *pci里修飾的是指向的對象,指向的是const int,這叫底層const。如何區分頂層const和底層const?
我認為可以總結為以下三個原則:
1.包含指針的聲明:靠近指針*的是頂層const,靠近類型的const是底層&<如果有&>
示例:
int i = 5;
int *const p1 = i; // 頂層const
const int *const p3 = i; // 靠右的const是頂層const,最左邊的const是底層const
2.不包含指針的聲明:均為頂層const
示例:
const int ci = 42; // 頂層const
3.用於聲明引用的const都是底層const
示例:
const int r = ci; // 底層const
const int a = 1;頂層const int* const a = 1;底層const頂層在外面,底層在中間。我是這麼記的,剛開始容易忘,過段時間就記住了
太神奇了,我今天下午也在看這個地方。。
推薦閱讀:
※《C++ Primer》和《C++ Primer Plus》有哪些區別?
※string頭文件和string.h頭文件是一樣的?
※c++ primer 第五版關於decltype的一個問題?
※為什麼c++要「在頭文件中聲明,在源文件中定義」?
※關於C++ primer 「未知數目的輸入」 的問題(結果與預期不符)?
TAG:CPrimer |