1.
中文版:
设置一个类型为auto的引用时,初始值中的顶层常量属性依然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。”
英文版:
When we ask for a reference to an auto-deduced type, top-level consts in the initializer are not ignored. As usual, consts are not top-level when we bind a reference to an initializer
怎么理解这段话呢?能否举例说明?
top-level
const
:const
修飾的是自身。low-level
const
:const
修飾的是別人。什麼叫自身,什麼叫別人? C++ 的世界:
所以,有以下幾個規律:
const
,也可以是 low-levelconst
。const
。指針何時是 top-level
const
,何時是 low-levelconst
,請參考昨天回答的你的另一個問題。(
const char *
是 low-level,char * const
是 top-level.)如果上面這堆概念你都搞清楚了的話,我們在來理解一下你引用的話。舉例說明:
好了,
ci
是const int
,是 top-levelconst
;r1
呢?是const int&
,是引用,引用必然是 low-levelconst
。所以:
後半句同意吧?
再看範例裡面的
r1
,請問你可以修改它嗎?你可能會不解,廢話,都加了const
還能修改?那我們來看另一個例子:
看到了吧,對於指標來說,low-level
const
是可以修改的! (對應開始的概念,指針可以是"別人",別人是const
不影響指針指向另一個人)那麼
const int*
可以修改,而const int&
不能修改,這是由引用本身的概念導致的(一旦初始化無法再次綁定)。即,
const
引用是 low-levelconst
的同時,也兼備了 top-levelconst
的特質,即"自身"無法被修改。所以:
說的是“頂層常數屬性仍然保留”,好好體會一下這裡說的頂層常量屬性的含義。
綜上所述,結合我給的例子。最簡單的解釋:
auto &r1 = ci;
發生了什麼事?const
降成 low-levelconst
.const
的特質(自身無法修改)依然保留。清楚了嗎?
PS: 為什麼 C++ Primer 提倡多用引用,少用指針,因為指針太過於靈(奇)活(葩)。還是引用比較好駕馭。 。 。
這方面教學很多了,我簡單寫下, 如果理解不對,歡迎指正。