Mordern Effective C++ --auto

5. 優先使用auto而非顯示類型聲明

在C++之中,使用auto關鍵字聲明類型能夠將程序員從輸入繁瑣的類型中解放出來,編譯器會自動推導出變量的實際類型。程序員

template<typename It>
void dwim(It b, It e)
{
  while(b != e){
    typename std::iterator_traits<It>::value_type
    currValue = *b;
      ...
  }
}

使用auto關鍵字函數

template<typename It>
void dwim(It b, It e)
{
  while(b != e){
    auto currValue = *b;
      ...
  }
}

在C++14中,lambda函數的參數均可以使用auto來定義。code

auto derefLess =                            // C++14 comparison
  [](const auto& p1,                          // function for
     const auto& p2)                          // values pointed
  { return *p1 < *p2; };

使用auto生命類型還能夠將咱們從類型截斷的問題中解放出來:對象

std::vector<int> arrs;
auto size = arrs.size();

在C++中,unordered_map的key的類型是const類型的,因此即使採起以下方式遍歷unordered_map容器,仍然會產生臨時對象:get

std::unordered_map<std::string, int> m;
   ...

for (const std::pair<std::string, int>& p : m)
{
   ...                  // do something with p
}

可是藉助auto,咱們不只使聲明更加簡潔,還避開了此問題:編譯器

std::unordered_map<std::string, int> m;
   ...

for (const auto& p : m)
{
   ...                  // do something with p
}

6. 當auto推導出非預期類型時應當使用顯示的類型初始化

在C++中,由於標準不容許返回對bit的引用,因此對於vector<bool>標準庫進行了特化處理,其[]運算符返回的是std::vector<bool>::reference類型的臨時對象。對臨時對象的修改會被其同步到vector中,於是這樣使用auto關鍵字是不合規的。同步

Widget w;
…
auto highPriority = features(w)[5];         // w是否是個高優先級的?
…
processWidget(w, highPriority);             // 配合優先級處理w

在這種狀況下,咱們只需顯示指出highPriority的類型爲bool便可規避此問題。string

相關文章
相關標籤/搜索