
項目 30:完全転送できない場面を把握する
|
211
•
ムーブ演算を使用できない
例外を発生させないムーブ演算が必要な場面だが、そのムーブ演算が noexcept と宣言され
ていない。
ムーブセマンティクスを用いても効率が向上しない場面も挙げておいた方が良いでしょう。
•
元オブジェクトが左辺値である
ごく一部の例外を除き(項目 25 などを参照)、ムーブ元となれるのは右辺値のみである。
しかし、本項目のタイトルはムーブ演算は存在しない、コスト安でもない、使用もされないと想
定する、です。そう、想定するです。その理由は、テンプレートを記述する場合など一般的なコー
ドの多くが該当しますが、使用する型のすべてを熟知している訳ではないためです。このような状
況では、C++98、すなわちムーブセマンティクス導入前がそうだったように、オブジェクトのコピー
については保守的な立場をとらざるを得ません。また、コードが「不安定(unstable)」になる場面
でもあります。すなわち、使用する型の性質が比較的頻繁に変更される傾向を持つ状況です。
しかし、使用する型を熟知しており、その性質が変更されないと分かっている場合も多くありま
す(コスト高ではないムーブ演算に対応しているか否かなど)。この場合、本項目の想定は無用で
す。使用する型のムーブ対応の実装を単純に確認すれば済みます。コスト安なムーブ演算を備えて
いれば、かつ、そのムーブ演算が実行される場面でそのオブジェクトを使用しているならば、コピー
演算がコスト安なムーブ演算で置き換えられると想定しても安全です。 ...