2014年7月14日月曜日

【読書ノート】Effective Modern C++ - Introduction

O'Reilly Early Releaseで購入したEffective Modern C++のドラフト版の読書記録です。

※この記事はあくまで私の備忘録であり、本の内容のまとめではないことに注意してください!(断りなく自分の解釈や考え・感想を入れたり、理由もなく内容を省略したり、間違いや曲解もあると思います。誤りの指摘は歓迎です。)

Introductionでは、C++11で新たに登場した概念、特に(私のような)初心者がつまずきやすいとこを中心に用語説明が書かれていました。

C++11での大きな変更

  • auto
  • range-based for文
  • lambda式
  • rvalue reference
  • 新しい非同期処理
さらに他にも
  • 0がnullptrに
  • typedefがalias declarationsに
  • Enums should now be scoped
  • スマートポインタが生ポインタより好ましいものに
  • 通常、オブジェクトのmoveがcopyよりもいいように

とにかくC++11には学ぶべきものがたくさんある。さらにC++14まで取り入れたらより多くなる。
そしてそれ以上に重要なことは、新しい機能を効果的に使うために学ぶべきことがたくさんあることだ。
C++11、C++14の機能・特徴については既に情報が溢れている。
この本の目的は、それらの機能を正しく、効率的に、保守性・移植性を保つように使いこなすことだ。
注意点として、この本の各itemはガイドラインであってルールではない。
ガイドラインに例外はつきものなので、最も重要なのはアドバイスの背後にある論理。

用語と慣例

ISO標準規格のバージョン: C++98, C++03, C++11, C++14
C++03はC++98のマイナーバージョンアップなので、この本では同一視する
C++14はC++11の上位互換なので、C++11と言ったらC++14の内容も指すことにする
C++14と書いた場合はC++14のみを指す
単にC++と書いた場合は全てのバージョンで成立することを指す

lvalueとrvalue

lvalueとrvalueを見分ける経験則はアドレスを取れるかどうか
Widget(Widget&& rhs); // rhsはrvalue reference型を持っているが自身でアドレスを持っているのでlvalue

ムーブセマンティクスの登場で変わった初期化コスト

void someFunc(Widget w);
この関数宣言を見ただけでは、Widget wの初期化にどの程度計算コストがあるかは分からない
lvalueが渡されたらコピーコンストラクタによって初期化されるし、rvalueならムーブコンストラクタで初期化される

パラメータと引数の区別

void someFunc(Widget w); // wは関数のパラメータ (parameter)
Widget wid;
someFunc(wid); // widは関数の引数 (argument)
someFunc(std::move(wid)); // std::move(wid)は関数の引数
パラメータはlvalue、引数はlvalueかもしれないしrvalueかもしれない

例外安全(exception-safety)の概念

よく設計された関数はexception-safeである。
basic guaranteeでは、例外が発生してもデータ破壊やリソースリークが生じないことを保証する
strong guaranteeでは、例外が発生しても(その関数が)呼び出される前と状態が変わらないことを保証する

callable entity

callable entityとは、非メンバ関数呼び出しの形式で呼び出すことのできるあらゆるものを指す。(関数、関数ポインタ、関数オブジェクトなど。)
ラムダ式で生成された関数オブジェクトはクロージャーとして知られているが、この本では区別せずラムダ式と呼ぶ。

deprecate

基本的にC++は後方互換性を保っているが、C++11でdeprecateされたものもある
deprecateは今後の規格で取り除かれる可能性があることを示す
たとえばstd::auto_ptrはstd::unique_ptrの方が良いのでdeprecatedとなった

ctor: constructor(コンストラクタ)の略
dtor: destructor(デストラクタ)の略

【読書ノート】Effective Modern C++ - Item 1 [1 / 2]

0 件のコメント:

コメントを投稿