2015-04-29 20 views
-3

我有一個關於使用時auto在什麼情況下應該使用自動類型?

  1. 明確,它不是不顧上下文更清晰一些問題嗎?
  2. 最好是明確而不是auto的情況?

而且隨着lambda函數使用auto如何將這些

auto f = [](auto v, auto x) {}; 
//or 
std::function<void(auto v, auto x)> f; 

謝謝...

+1

您提供的兩條線做了兩件完全不同的事情。 Lambda是一種情況,你實際上必須使用auto,因爲它們的類型只有編譯器才知道。 [這](http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/)imight對你很有意思。 – MikeMB

+1

@MikeMB我不知道這件事。這兩行都沒有編譯,所以他們做了同樣的事情。一行是CLOSER編譯? (只缺少2個字符)。另一個包含對C++ 14的「auto」的基本誤解。 – Yakk

+0

@Yakk:你說的對,特別是功能版本沒有任何意義,無論如何。但是lambda和std ::函數在它們代表的內容以及它們的存儲方式上有着根本性的不同。每個lambda都是一個具有自己類型的函數對象,並在堆上創建。 'std :: funcion'是包裝,可以例如包裝不同的功能或功能對象,只要它們具有正確的界面。很可能我也誤解了這個問題,因爲我主要關注何時使用auto作爲變量,而不是lambda表達式的參數類型演繹。 – MikeMB

回答

0

就個人而言,我傾向於使用auto了少數類型的代碼:

  1. Unutterable類型,例如由lambda創建的類型:

    auto f = []() { /* some code */ }; 
    
  2. 迭代器,因爲它們都實現相同的不透明接口。我不在乎它是什麼特定類型的迭代器,只是它的行爲像一個。

    auto it = m.find(key); 
    if(it != m.end() { 
        /* some code */ 
    } 
    
  3. ,如果該類型已在同一行說,例如轉換:

    float f = 123.456; 
    /* some code */ 
    auto n = static_cast<int>(f); 
    

    或類似:

    if(auto p = dynamic_cast<Derived *>(base_ptr)) { 
        /* some code here */ 
    } 
    

對於一切,我會傾向於明確。

關於std::function vs auto,我會在我可以的時候使用auto,然後根據需要再使用std::function。這是因爲std::function由於使用類型擦除技術來實現,所以具有輕微的開銷。

這通常意味着我將使用模板來實現在合理時也接受「可調用事物」的函數。這就是說,如果我需要存儲一個函數,可能會傳遞它,那麼std::function是非常適合的。

相關問題