2014-09-04 96 views
3

我開始撿起C++ 11,在這一點上我有一個「自動」的愛恨。C++ auto - 方便和混淆

毫無疑問,這很方便。

但它也是混亂的,這裏是一個代碼:

auto w = foo->get_w(); 
auto i = w->get_i(); 
bar(i); 

在這段代碼,get_w()函數返回「結構S *」,這是W公司的類型。但結構S有2個重載get_i():

const I* get_i() const; 
unique_ptr<I>& get_i(); 

由於w是不是const,所以這是第二get_i()被調用,從而bar(i)應該是bar(move(i))因爲巴()簽名是void bar(unique_ptr<I>)

但實際上,很容易迷路。

這很好,這是在編譯時遇到的,但是,我想,我最初的熱情正在減退。

您覺得如何?任何提示?

+0

'bar'的原型是什麼? – 2014-09-04 16:46:39

+7

我認爲這裏的問題是令人困惑的const重載。這兩種類型完全無關。你可能想和struct'S'的作者交談。 – milleniumbug 2014-09-04 16:47:04

+2

似乎很奇怪你會用完全不同的簽名來重載一個函數。 – 2014-09-04 16:47:28

回答

4

對於這個問題,我必須鏈接這個優秀的文章由赫布薩特:GotW #94 Solution: AAA Style (Almost Always Auto)

您可以從標題中閱讀他的意見。他還帶來了本指南其中的基本原理的文章中解釋說:

指南:請記住,寧願auto變量主要是由正確性,性能,可維護性和健壯性,只有最後大約打字方便動機。他稱讚約auto

的主要方面是,它避免了不想要的隱式轉換,其中,有在C++和它使呼叫者較少依賴於函數的接口有很多,因爲在返回類型的變化中自動反映局部變量的類型。 auto在模板代碼中也非常有用,因爲您不必訪問Container::value_type

2

這取決於。只要它比混淆更方便,那就使用它,否則不要。 對於一長串的論據和意見,我會參考另一個不同的問題:Use of var keyword in C#