為什麼你要盡量用auto

2021-09-25 20:43:53 字數 1678 閱讀 4831

總的來說,使用auto可以幫助你實現正確、高效的變數宣告,讓**更健壯,可維護性更高。

由於auto宣告的變數,其型別推導自初始化物,所以他們必須被初始化。

int x;   //可以未初始化

auto x; //error, 必須被初始化

auto x = 1; //ok, x -> int

這樣就避免了你使用乙個未初始化變數而不小心引出的bug。

有時候當你顯示的宣告乙個變數的型別的時候,可能你寫出的型別並不是正確的型別。考慮下面的例子:

int i = sizeof(arr); //sizeof的返回值是unsigned int
std::mapmymap;

......

for (const std::pair& p : mymap)

上面的**初看起來沒有問題,可是你忘了std::map的鍵是const,所以存放在map裡的是std::pair,而不是我們寫的那個。所以當你做迴圈時,每次都會生成乙個臨時物件,這個臨時物件的型別就是你的p要繫結的型別。所以,不知不覺中你讓你的**更慢了。

c++11以來,由於多了lambda表示式,你可能經常在演算法中使用lambda,但是乙個lambda表示式的型別該是什麼呢?可能只有編譯器才會知道。所以你可以這麼寫:

auto f =  (int i)
還有我們經常在**中寫下這樣的語句:

std::vectorv;

std::vector::const_iterator ite = v.cbegin();

for (; ite != v.cend(); ++ite)

是不是每次寫出這種長長的型別都要敲擊好多次鍵盤,為了我們的鍵盤壽命更長一點,我們就這麼寫吧:

for (auto ite = v.cbegin(); ite != v.cend(); ++ite)

假如我們寫乙個函式,這個函式返回兩個實參相加的結果,為了讓其更加通用,我們會這樣寫:

template??? add(t1 t1, t2 t2)

這個例子中,假如t1和t2的型別不一樣,我們該怎麼宣告add的返回值型別呢?可以用decltype嗎,假如我們這麼寫:

templatedecltype(t1+t2) add(t1 t1, t2 t2)

但是,編譯器沒那麼聰明,編譯器是從前往後編譯的,所以decltype用到的t1和t2,並沒有被事前宣告。但是你可以這麼寫:

templateauto add(t1 t1, t2 t2) ->decltype(t1+t2)

在c++14中,你可以簡單的這麼寫:

templatedecltype(auto) add(t1 t1, t2 t2) 

在 c++17中,你連decltype也可以省掉,直接auto就可以了。

當然有時候你會說每個變數都宣告為auto,會降低**的可讀性。當然,是這樣的。雖然你可以依賴ide,滑鼠懸停在變數上來檢視變數的準確型別。使用auto不代表你在任何時候都要使用auto,而是盡可能的。

為什麼建議MySQL列屬性盡量用NOT NULL

在 高效能mysql 中提到,通常情況下最好指定列為not null,除非真的需要儲存null值。雖然把null 改成not null 對索引的效能並沒有明顯提公升,但可能會出現不必要的麻煩。測試如下 create table t1 id int 11 not null name varchar 2...

為什麼前端盡量少用iframe

從效能上來講,iframe消耗瀏覽器的效能比用div至少多出十幾倍甚至更多。使用較多時,http請求數目較多,而frame和iframe自身載入速度較慢,布局不易修改。最好使用div替代。只知道皮毛,希望大家能有更詳盡的分析。一般使用ajax來獲取資料,如果獲取的資料不在同乙個網域名稱下互相呼叫資料...

為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?

from 本文是從 why why why why why are you a developer?這篇文章翻譯而來。做乙個程式設計師很忙,你需要去寫 去建立meme,去進行測試,以及隨時關注最新最熱的gem 開源軟體技術。最近,我一直在想讓自己的節奏慢下來,去做一些心裡一直想做但沒有去做的事,去思...