- 有効である可能性があります(1)。 dtor/ctorの存続期間に関するあなたの特定の問題に対処するために、有効です(2)。これは、ベクターの元の実装がどのように機能したかです。
- それは(それはおそらくない)良いアイデアかもしれないが、あなたは、標準的な方法を望んでいないことがあります。(3)
(1)動きがで有効にする必要があるかどうかについての論争があります自己移動の場合。 自己移動の安全についての疑問は、コードが安全でなければならないという位置です(確かに、自己割り当てが安全であると確信しています)。また、いくつかのユーザーエクスペリエンスでは、移動、自己移動を使用する多くのアルゴリズムではチェックが可能で退屈であることが報告されています。
自己移動の安全性に対する疑念は、移動意味の全体が時間節約であり、そのためにできるだけ速く動くべき位置です。自己移動チェックは、移動コストに比べて高価になる可能性があります。自然な(キャストされていない)右辺値は自己移動できないため、コンパイラは自己移動コードを生成しません。自己移動を行う唯一の方法は、 "std :: move()"キャストを明示的に呼び出す場合です。これは、std :: move()の呼び出し元に負担をかけることで、自己移動が関与していないかどうかを検証したり、自己移動が関与していないことを確かめたりします。また、 "std :: move"に相当するユーザー定義のセルフ・ムーブをチェックしてから、何もしなかったことは自明です。自己移動をサポートしていない場合は、それを記録することができます。
(2)これはテンプレートではないので、 "new(this)Class(std :: move(rhs));"投げることができます。可能であれば、これは無効です。
(3)このコードは、より伝統的なスワップアプローチを期待するかもしれないメンテナのパズルかもしれませんが、スワップアプローチの潜在的な欠点があります。ターゲットによって解放されるリソースができるだけ早く解放される必要がある場合(ミューテックスなど)、スワップにはリソースが移動元オブジェクトにスワップされるという欠点があります。移動が "std :: move()"の呼び出しの結果である場合、移動元オブジェクトはすぐに処理されないことがあります。 (これはテンプレートではないため、どのリソースが解放されているか知ることができます。メモリが唯一のリソースであれば問題ありません)
より良いアプローチは、リソースの解放デストラクタのコードと移動コンストラクタのリソース移動コードを使用して、この移動代入演算子でそれらの(インライン化された)ルーチンを呼び出します。
'〜クラス'または 'new(this)クラス(std :: move(rhs))'がスローするとどうなりますか? – Yakk