【C++ Primer(7)】auto型別說明符

weixin_34393428發表於2017-09-15
  • auto讓編譯器通過初始值分析表示式所屬的型別,因此auto定義時必須有初始值
  • auto一般會忽略頂層const保留底層const,簡單理解就是直接用auto定義的非指標或引用型別都是non-const
int i = 0;
const int ci = i, &cr = ci;
auto b = ci; // b是int,ci的頂層const特性被忽略
auto c = cr; // c是int,cr只不過是ci的別名
auto d = &i; // d是int*
auto e = &ci; // e是const int*(對常量物件取地址是一種底層const)
  • 如果希望auto推斷出頂層const,加上const修飾符
const int ci = i;
const auto f = ci; // ci的推演型別是int,f是const int
  • 可以將引用的型別設定為auto,相當於用auto替代原來的型別定義,遵循原來的初始化規則,const會保留
int i = 0;
const int &ci = i;
auto& j = ci; // const int &j
auto& k = 42; // 錯誤,引用必須初始化
const auto& r = 42; // const int &r
// 設定auto型別的引用,初始值的頂層const屬性保留
  • 對於universal reference,只有右值才會將auto&&推斷為右值引用
int i = 42;
const int j = 55;
auto&& r1 = i; // int& r1
auto&& r2 = j; // const int& r2
auto&& r3 = 45; // int&& r3
  • 對陣列名,auto會推斷為指標,而auto&會推斷為陣列
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
auto a2(a); // a2是int*,和auto a2(&a[0])等價
cout << a2[2]; // 正確,用指標同樣可以獲取元素
for(auto x : a2) cout << x; // 錯誤
auto& a3(a); // int(&)[10]
for(auto x : a3) cout << x; // 正確
  • 也可以用decltype來推斷為陣列
decltype(a) a4 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  • 在宣告符列表中,auto必須始終推導為同一型別
auto i = 1, j = 1.1; // 錯誤

相關文章