C++新標準侯捷(三)標準ライブラリ

994 ワード

14.右の値の参照
標準ライブラリに置くのは、言語の部分ですが、次のものは標準ライブラリと関係があるからです.
不要なcopyを解決するのに役立ちます.
割り当ての右が右の値である場合、左のオブジェクトは右のオブジェクトのリソースを盗むことができます.
Lvalue:operator=左側に表示できます.
Rvalue:operator=右側にのみ表示されます.
整数ではa+b=42は不可であり,文字列ではs 1+s 2=s 2,複素ではc 1+c 2=cpmplex(4,9)は可能であることを実験で見出した.
int foo(){return 5;}
...
int x=foo();   //OK
int *p = &foo();    //[Error]            ,        
foo() = 7;     //[Error]
したがって、呼び出し側でコンパイラに「これは右の値です」と伝える構文が必要です.呼び出し先
c.insert(ite,Vtype(buf));//仮の相手、右の値を教えてあげます.
M c2(std::move(c1));//moveで右の値を教えてあげます.
15.Perfect Forwarding(完璧な伝達)
不完全な伝達:右の値はforward()を介して別の関数に伝達され、左の値になります.
もちろん,標準ライブラリでは解決したが,比較的複雑で下位層であるため,ここでは具体的に検討しない.std::forward();
16.move aware class(move意識のあるクラス)を書く
big-three:コピー構造、コピー付与、構造関数.
コピーコンストラクション関数は通常メモリ操作を伴うため、例外を放出する必要がありますが、移動コンストラクション関数は移動メモリ所有権であることが多いため、例外を放出する必要はありませんので、noexceptと宣言します.
str._data=null;//重要です.そうでなければ、一時的なオブジェクトの生命が終わると、データの部分をdeleteします.