第一章 類型推導
=============
C++98只有一種類型推導規則:函數模板。C++11修改了一點規則樣本,并且添加額外的兩條規則,一條是`auto`,另一個是`decltype`。C++14繼續擴展了`auto`和`decltype`的使用情況。隨著類型推導的廣泛使用,會使得你從一些明顯的或者是冗余的類型拼寫中解放出來。它使得C++編寫的軟件更加具有適用性,因為改變代碼中的一處地方的類型,編譯器會在代碼的其他地方自動的推導出類型定義。但是這使得代碼掃描過程更加困難,因為類型推導對編譯器來說并不是你想的那么簡單。
不去理解類型推導是如何操作的,高效的使用現代C++進行編程是不可能的。在類型推導過程中有太多的上下文判斷,在大多數情況,`auto`出現在調用函數模板時,在`decltype`表達式里面,和在C++14中,神秘的`decltype(auto)`構造。
本章提供每個C++開發者必需的關于類型推導的信息。解釋了模板類型推導是怎么工作的,`auto`如何左右類型,`decltype`是怎樣運行的。甚至解釋了如何強制編譯器限定顯示類型推導的結果,這樣會幫助你明確編譯器推導的類型是不是你所需要的。
- 出版者的忠告
- 致謝
- 簡介
- 第一章 類型推導
- 條款1:理解模板類型推導
- 條款2:理解auto類型推導
- 條款3:理解decltype
- 條款4:知道如何查看類型推導
- 第二章 auto關鍵字
- 條款5:優先使用auto而非顯式類型聲明
- 條款6:當auto推導出非預期類型時應當使用顯式的類型初始化
- 第三章 使用現代C++
- 條款7:創建對象時區分()和{}
- 條款8:優先使用nullptr而不是0或者NULL
- 條款9:優先使用聲明別名而不是typedef
- 條款10:優先使用作用域限制的enmu而不是無作用域的enum
- 條款11:優先使用delete關鍵字刪除函數而不是private卻又不實現的函數
- 條款12:使用override關鍵字聲明覆蓋的函數
- 條款13:優先使用const_iterator而不是iterator
- 條款14:使用noexcept修飾不想拋出異常的函數
- 條款15:盡可能的使用constexpr
- 條款16:保證const成員函數線程安全
- 條款17:理解特殊成員函數的生成
- 第四章 智能指針
- 條款18:使用std::unique_ptr管理獨占資源
- 條款19:使用std::shared_ptr管理共享資源
- 條款20:在std::shared_ptr類似指針可以懸掛時使用std::weak_ptr
- 條款21:優先使用std::make_unique和std::make_shared而不是直接使用new
- 條款22:當使用Pimpl的時候在實現文件中定義特殊的成員函數
- 第五章 右值引用、移動語義和完美轉發
- 條款23:理解std::move和std::forward
- 條款24:區分通用引用和右值引用
- 條款25:在右值引用上使用std::move 在通用引用上使用std::forward
- 條款26:避免在通用引用上重定義函數
- 條款27:熟悉通用引用上重定義函數的其他選擇
- 條款28:理解引用折疊
- 條款29:假定移動操作不存在,不廉價,不使用
- 條款30:熟悉完美轉發和失敗的情況
- 第六章 Lambda表達式
- 條款31:避免默認的參數捕捉
- 條款32:使用init捕捉來移動對象到閉包
- 條款33:在auto&&參數上使用decltype當std::forward auto&&參數
- 條款34:優先使用lambda而不是std::bind
- 第七章 并發API
- 條款35:優先使用task-based而不是thread-based
- 條款36:當異步是必要的時聲明std::launch::async
- 條款37:使得std::thread在所有的路徑下無法join
- 條款38:注意線程句柄析構的行為
- 條款39:考慮在一次性事件通信上void的特性
- 條款40:在并發時使用std::atomic 在特殊內存上使用volatile
- 第八章 改進
- 條款41:考慮對拷貝參數按值傳遞移動廉價,那就盡量拷貝
- 條款42:考慮使用emplace代替insert