ホームページ > バックエンド開発 > C++ > 移動代入演算子に「if (this != &rhs)」チェックは必要ですか?

移動代入演算子に「if (this != &rhs)」チェックは必要ですか?

DDD
リリース: 2024-11-28 00:33:11
オリジナル
211 人が閲覧しました

Is the `if (this != &rhs)` Check Necessary in a Move Assignment Operator?

移動代入演算子と if (this != &rhs)

クラスの標準のコピー代入演算子では、代入されたオブジェクトがif (this != &rhs) を使用して呼び出し元オブジェクトの変更を避けるのと同じです。しかし、このチェックは移動代入演算子に必要ですか?

移動セマンティクス

operator=(Class&&) で示される移動代入演算子は、リソースの所有権を効率的に転送するように設計されています。あるオブジェクトから別のオブジェクトへ。コピーの割り当てとは異なり、オブジェクトの新しいコピーを作成する必要がなくなります。

状況分析

Can this == &rhs?

これ == &rhs が移動代入で true になり得るかどうかという疑問が生じます。演算子。

オブジェクトが右辺値参照にバインドされる場合、次の 2 つのシナリオがあります。

  1. これは実際の一時オブジェクトです。
  2. 呼び出し元がそのふりをするオブジェクトです。

最初のケースでは、オブジェクトは一時オブジェクトへの一意の参照であるため、オブジェクトでは、これ == &rhs は不可能です。 2 番目のケースでは、this != &rhs であることを確認するのは呼び出し側の責任であり、チェックが不要になります。

チェックしないための引数

著者は、if (this != &rhs) チェックは次の理由により冗長です:

  • の自己代入一時的な処理は不可能です。
  • 意図的にオペレーターを欺くクライアントは、コードを修正する必要があります。

このチェックを省略すると、オブジェクトが頻繁に移動されたり割り当てられたりする状況でパフォーマンスを向上させることができます。

チェックのための議論

しかし、 this != が正しいと主張する人もいます。 &rhs チェックは、自己移動割り当てを防ぐために依然として必要です。彼らは、swap(x, x) を有効な操作として許可すると、このチェックがトリガーされる可能性があると主張しています。

解決策と考慮事項

著者は次のように結論付けています。

コピーして移動の割り当て事後条件:

  • コピー代入: y の値は、自己コピー代入の場合を含め、変更されないままである必要があります。
  • 移動割り当て: y は有効だが未指定の状態 (for を含む) を持つ必要があります。 self-move-assignment.

Self-Move-Assignment 実装:

これを実現するには、次のようなクラスでの移動代入演算子の 3 つの実装が考えられます。 Dam_array が提供されます:

1. チェック自己移動割り当てを区別するために実行され、続行する前にオブジェクトが有効な状態に設定されます。

2. チェックインが省略され、自己移動割り当てが no- になります。 op.

3. クラスが必要なリソースを保持していない場合、swap(other) メソッドが使用されます。すぐに解放されます。

著者は、最適な実装は特定のクラス設計、ハードウェア特性、およびパフォーマンス要件に依存すると強調しています。

クラスがメモリを直接管理しない場合は、operator=(Class& を使用することを推奨しています。 &) = デフォルト;基本的な例外安全性を備えた最高のパフォーマンスを実現します。

以上が移動代入演算子に「if (this != &rhs)」チェックは必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート