-3
我有一個關於使用時auto
在什麼情況下應該使用自動類型?
- 明確,它不是不顧上下文更清晰一些問題嗎?
- 最好是明確而不是
auto
的情況?
而且隨着lambda函數使用auto
如何將這些
auto f = [](auto v, auto x) {};
//or
std::function<void(auto v, auto x)> f;
謝謝...
我有一個關於使用時auto
在什麼情況下應該使用自動類型?
auto
的情況?而且隨着lambda函數使用auto
如何將這些
auto f = [](auto v, auto x) {};
//or
std::function<void(auto v, auto x)> f;
謝謝...
就個人而言,我傾向於使用auto
了少數類型的代碼:
Unutterable類型,例如由lambda創建的類型:
auto f = []() { /* some code */ };
迭代器,因爲它們都實現相同的不透明接口。我不在乎它是什麼特定類型的迭代器,只是它的行爲像一個。
auto it = m.find(key);
if(it != m.end() {
/* some code */
}
,如果該類型已在同一行說,例如轉換:
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
是非常適合的。
您提供的兩條線做了兩件完全不同的事情。 Lambda是一種情況,你實際上必須使用auto,因爲它們的類型只有編譯器才知道。 [這](http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/)imight對你很有意思。 – MikeMB
@MikeMB我不知道這件事。這兩行都沒有編譯,所以他們做了同樣的事情。一行是CLOSER編譯? (只缺少2個字符)。另一個包含對C++ 14的「auto」的基本誤解。 – Yakk
@Yakk:你說的對,特別是功能版本沒有任何意義,無論如何。但是lambda和std ::函數在它們代表的內容以及它們的存儲方式上有着根本性的不同。每個lambda都是一個具有自己類型的函數對象,並在堆上創建。 'std :: funcion'是包裝,可以例如包裝不同的功能或功能對象,只要它們具有正確的界面。很可能我也誤解了這個問題,因爲我主要關注何時使用auto作爲變量,而不是lambda表達式的參數類型演繹。 – MikeMB