2014-01-12 77 views
0

我明白,我們可以使用auto像:auto有什麼用途?

auto a = 1; 
auto b = Foo(1,2); 

或者在函數調用:

auto foo(){ 
    return Foo(1,2); 
} 

但C++ 11還提供了統一的初始化和初始化列表,所以我們可以這樣做:

Foo a {1,2}; 
Foo b = {1,2}; 
Foo foo(){ 
    return {1,2}; 
} 

那麼如果我們已經有大括號語法,auto的用法是什麼? (除了定義一個原始類型)

+1

微不足道的例子:'auto it = v.beg in()'其中'v'是推導的上下文中的某個類型爲'T'的容器。 – juanchopanza

+1

看看[草藥薩特的「AAA風格」文章](http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/)。 – Casey

+0

使用'auto'推斷函數的返回類型是C++ 1y特性。在C++ 11中,只有尾隨返回類型'auto foo() - > Foo;'功能(以及簡單lambda表達式的返回類型推導)。 – dyp

回答

1

auto最適合模板和迭代器。

它不僅可以真正簡化語法和提高代碼可讀性,還可以過時一些廣泛的模板使用。

檢查出this guy's page - 非常好,重點。

Conciser如下:

template <typename BuiltType, typename Builder> 
void makeAndProcessObject (const Builder& builder) { 
    BuiltType val = builder.makeObject(); 
    // ... 
} 

現在有了auto你可以擺脫多種類型的模板:

template <typename Builder> 
void makeAndProcessObject (const Builder& builder) 
{ 
    auto val = builder.makeObject(); 
    // ... 
} 

而且,當你真正調用這個函數,你不需要提供任何類型作爲模板參數:

MyObjBuilder builder; 
makeAndProcessObject(builder); 
+0

這也可以輕鬆解決沒有自動。即用'typedef's。儘管可以認爲'auto'更優雅,但其他人可能會更好地考慮'typedef',因爲它會在代碼中體現'Builder'和'BuiltType'之間的關係。除此之外,這兩個片段不是等價的:你不能在不調用'makeObject()'的情況下在下面的代碼片段中創建(/ default構造)一個'BuiltType'類型的對象。在上面的例子中,這是可能的。 – Paranaix

6

我認爲最好的使用auto可以看出,當你用它與良好的ol迭代器。比較:

for (std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it) 

到:

for (auto it = vector.begin(); it != vector.end(); ++it) 

即使在C++ 11,我們的範圍,維權,幫助了很多更好的,迭代器仍然被廣泛使用在情況下,你的範圍不定義良好或者您需要對元素執行操作。

一般而言,auto可以在編譯器自動推斷類型PITA類型時使用。

3

當返回類型是未指定您需要自動。例如,std::bind

using namespace std::placeholders; 
int n = 7; 
auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n); 
+0

另外,lambda表達式。你*可以使用'decltype'來獲取'bind'表達式的類型,但是這對lambda表達式不起作用,因爲* each * lambda表達式的類型是唯一的(並且它們可能不會顯示爲未評估的操作數IIRC)。 – dyp