C++ auto 型別推斷注意的地方

double64發表於2024-09-15
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

相關文章