2015/09/18に書籍タイトル「Effective Modern C++ − C++11/14プログラムを進化させる42項目」として日本語訳が刊行されました。(当然ながら)下記の抄訳とはItem訳および内容が少し異なります。ご注意ください。
2014/11/11に書籍タイトル"Effective Modern C++, 42 Specific Ways to Improve Your Use of C++11 and C++14"としてeBook版が刊行されたそうです。下記の抄訳Itemと正式版のItemとでは、すこし異なっています。ご注意ください。
Scott Meyers氏のブログ記事Book Report: New Title, New TOC, New Sample Itemより、C++11/C++14を対象とした"Effective Modern C++"目次一覧(予定)の勝手抄訳。
該当書籍"EMC++(Effective Modern C++)"は、"EC++(Effective C++)", "MEC++(More Effective C++)"のアップデートとして刊行予定だそうです。非常に楽しみですね(日本語版はいつ頃になるでしょう?)
- Chapter 1 型推論
- Item 1: テンプレート型推論を理解しよう
- Item 2:
decltype
を理解しよう - Item 3: 推論された型の見かたを知ろう
- Chapter 2 auto
- Item 4: 明示的な型宣言よりも
auto
を使おう - Item 5: 変数宣言では
auto
+ { expr }がstd::initializer_list
となることを忘れずに - Item 6: 型付き初期化(typed initializer)イディオムに注意しよう1
(訳注:initializer_list<T>
のこと?)
- Item 4: 明示的な型宣言よりも
- Chapter 3 C++98からC++11そしてC++14へ
- Item 7: オブジェクト生成時の
()
と{}
を区別しよう - Item 8:
0
やNULL
よりもnullptr
を使おう - Item 9:
typedef
よりもalias宣言を使おう(訳注:後者はusing U = T;
構文) - Item 10: 従来の列挙子(unscoped enums)よりもスコープ付き列挙子(scoped enums)を使おう
- Item 11: privateな未定義関数よりも
delete
された関数を使おう - Item 12: オーバーライド関数では
override
宣言をしよう - Item 13:
iterator
よりもconst_iterator
を使おう - Item 14: できるだけ
constexpr
を使おう - Item 15: constメンバ関数はスレッドセーフにしよう
- Item 16: できるだけ関数を
noexcept
と宣言しよう(訳注:"whenever possible"は強すぎる表現では?)2 - Item 17: 常にコピーされるようなムーブコストの安いパラメータでは、値渡し(pass by value)方式を検討しよう
- Item 18: 挿入(insertion)ではなく配置(emplacement)を検討しよう
- Item 19: 特殊なメンバ関数生成を理解しよう
- Item 7: オブジェクト生成時の
- Chapter 4 スマートポインタ
- Item 20: 排他所有リソース管理には
std::unique_ptr
を使おう - Item 21: 共有所有リソース管理には
std::shared_ptr
を使おう - Item 22: ぶら下がり(dangle)の可能性がある
std::shared_ptr
風ポインタにはstd::weak_ptr
を使おう - Item 23:
new
を直接使うのではなくstd::make_unique
やstd::make_shared
を使おう - Item 24: Pimpl Idiomを使うときは、実装を行うファイルにて特殊メンバ関数を定義しよう
- Item 20: 排他所有リソース管理には
- Chapter 5 ラムダ式
- Item 25: デフォルトキャプチャモードを避けよう
- Item 26: クロージャは小さく保とう
- Item 27:
std::bind
よりもラムダを使おう
- Chapter 6 右辺値参照(Rvalue References)、ムーブセマンティクス、完全転送(Perfect Forwarding)
- Item 28:
std::move
とstd::forward
を理解しよう - Item 29: 右辺値参照とUniversal referencesを区別しよう(訳注:後者はScott氏の造語)
- Item 30:
std::move
にて右辺値参照を、std::forward
にてUniversal referencesを渡そう/返そう - Item 31: Universal referencesによるオーバーロードを避けよう
- Item 32: Universal referencesによるオーバーロードの代替案を理解しよう
- Item 33: Reference collapsingを理解しよう
- Item 34: ムーブ操作が存在しない/軽量でない/利用されないと仮定しよう
- Item 35: 完全転送に失敗するケースについてよく理解しよう
- Item 28:
- Chapter 7 スレッディングAPI
- Item 36: 全ての実行パスで
std::thread
をunjoinableにしよう - Item 37: 非同期性が不可欠なら
std::launch::async
を指定しよう - Item 38: スレッドハンドルデストラクタのさまざまな挙動に注意しよう
- Item 39: one-shotイベント通信としてvoid futureを検討しよう
- Item 40: 並行性のために
std::atomic
を、メモリマップドI/Oのためにvolatile
を使おう - Item 41: 可能な限り逐次一貫性(sequential consistency)を採用しよう
- Item 36: 全ての実行パスで
おまけ:以前の目次案(抄訳)はEffective C++11(の種), Effective C++11/Concurrency関連の目次草案もあります。
-
正式版では"Item 6: Use the explicitly typed initializer idiom when
auto
deduces undesired types"に対応する。auto v = static_cast<T>(f())
のような明示的キャストを指す。 ↩ -
論争を引き起こしていたが、正式版では"Item 14: Declare functions
noexcept
if they won't emit exceptions"に対応する。 ↩