動態

詳情 返回 返回

簡述C++11中auto和decltype - 動態 詳情

本文是對auto和decltype的簡述,更加詳細的內容看文章後參考部分。

一. auto和decltype作用

C++11標準引入了auto和decltype類型説明符,它能讓編譯器幫我們去分析表達式所屬的類型。

auto 的推導能力較弱,而且還有限制。

例如: auto 不能推導數組類型:

  int arr[5] = {1};
  // auto 不能用於推到數組類型。 因為{arr}純粹是一個句法結構。 它不是一個表達式,也沒有類型。 因此, auto 不能從中推斷出它的類型。
  auto auto_arr2[10] = {arr};  // !!!! error: ‘auto_arr2’ declared as array of ‘auto’

而 decltype 可以:

  int arr[5] = {1};
  decltype(arr) auto_arr1[5] = {1};

除此之外還有其他地方,我們接着往下看。 總之,decltype的出現是為了解決auto存在的一些問題,能用auto一定可以用decltype。但是auto相比decltype又更加簡潔,所以能用auto就使用auto,不行就用decltype。

二. decltype 和 auto 區別

簡單的理解可以説,auto作用變量, decltype作用表達式。

  1. auto類型説明符用編譯器計算變量的初始值來推斷其類型(用auto聲明的變量必須初始化),而decltype雖然也讓編譯器分析表達式並得到它的類型,但是不實際計算表達式的值。
  2. 編譯器推斷出來的auto類型有時候和初始值的類型並不完全一樣,編譯器會適當地改變結果類型使其更符合初始化規則。例如,auto一般會忽略頂層const,而把底層const保留下來。與之相反,decltype會保留變量的頂層const。
  3. decltype在處理頂層const和引用的方式與auto有些許不同,如果decltype使用的表達式是一個變量,則decltype返回該變量的類型(包括頂層const和引用在內)。

如果表達式的內容是解引用操作,則decltype將得到引用類型。正如我們所熟悉的那樣,解引用指針可以得到指針所指對象,而且還可以給這個對象賦值。因此decltype(*p)的結果類型就是int&.

參考

  1. C++11新特性— auto 和 decltype 區別和聯繫
  2. C++ auto和decltype的區別
  3. C++中關鍵字auto和decltype的區別
  4. C++11:decltype類型推導

Add a new 評論

Some HTML is okay.