int i=0, &r = i;
auto a=r; // a是一個整數(r是i的別名,而i是一個整數) int a
auto 一般會忽略掉頂層 const(參見 2.4.3節,第57頁),同時底層 const 則會保留下來,比如當初始值是一個指向常量的指標時:
const int ci=i, &cr=ci;
auto b = ci; //b是一個整數(ci的頂層 const 特性被忽略掉了) int b
auto c = cr; //c是一個整數(cr是ci的別名,ci本身是一個頂層const) int c
auto d = &i; //d是一個整型指標(整數的地址就是指向整數的指標) int *d
auto e = &ci; //e是一個指向整數常量的指標(對常量物件取地址是一種底層 const) const int *e
如果希望推斷出的auto型別是一個頂層const,需要明確指出:
const auto f=ci; // ci的推演型別是int,f是const int
還可以將引用的型別設為 auto,此時原來的初始化規則仍然適用:
auto &g=ci; //g是一個整型常量引用,繫結到ci
auto &h=42; //錯誤:不能為非常量引用繫結字面值
const auto &j= 42; //正確:可以為常量引用繫結字面值
設定一個型別為auto的引用時,初始值中的頂層常量屬性仍然保留(//引用畢竟是別名,當然要一樣)。和往常一樣,如果我們給初始值繫結一個引用,則此時的常量就不是頂層常量了。
要在一條語句中定義多個變數,切記,符號 &
和 *
只從屬於某個宣告符,而非基本資料型別的一部分,因此初始值必須是同一種型別:
auto k=ci,&l=i; //k是整數,1是整型引用
auto&m=ci,*p= &ci; // m是對整型常量的引用,p是指向整型常量的指標
//錯誤:i的型別是int而&ci的型別是 const int
auto &n=i,*p2 = &ci;
《C++ Primer》 P62