※この記事はあくまで私の備忘録であり、本の内容のまとめではないことに注意してください!(断りなく自分の解釈や考え・感想を入れたり、理由もなく内容を省略したり、間違いや曲解もあると思います。誤りの指摘は歓迎です。)
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++14C++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(デストラクタ)の略
0 件のコメント:
コメントを投稿