總的來說,使用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 開源軟體技術。最近,我一直在想讓自己的節奏慢下來,去做一些心裡一直想做但沒有去做的事,去思...