4

私はいくつかのブーストコードを読んでいて、これに出くわしました:

inline sparse_vector &assign_temporary(sparse_vector &v) {
    swap(v);
    return *this;
}
template<class AE>
    inline sparse_vector &operator=(const sparse_vector<AE> &ae) {
        self_type temporary(ae);
        return assign_temporary(temporary);
    }

すべてのコンストラクターを代入演算子にマッピングしているようです。素晴らしい。しかし、なぜC++はそれらに異なることをさせることを選んだのでしょうか?私が考えることができるのはscoped_ptrだけですか?

4

3 に答える 3

6

なぜC++は彼らに異なることをさせることを選んだのですか?

割り当ては完全に構築されたオブジェクトで機能するためです。リソース管理クラスでは、これはすべてのメンバーポインタがすでにリソースを指していることを意味します。これを、実行前にメンバーが意味を持たないコンストラクターと比較してください。

ちなみに、C ++のごく初期の頃は、T a(b);実際にはとして定義されてT a; a = b;いましたが、これは非効率的であることが判明したため、コピーコンストラクターが導入されました。

于 2010-05-14T02:48:48.133 に答える
2

「assign_temporary」という名前は、割り当てが一時的なオブジェクトからのものであるため、割り当ての過程で破棄される可能性があることを示していることに注意してください。代入演算子は、後で使用する可能性のある通常のオブジェクトを取得するため、代入中にそれを破棄するオプションはありません。このBoostコードでは、「assign_temporary」は右辺値参照代入演算子と同義ですが、上に示した代入演算子は標準のconst(左辺値)代入代入演算子であるため、 2。

ただし、代入演算子は通常、コピーとスワップのトリックを使用して実装されることに同意します(コピーコンストラクターでコピーを作成してから、コピーとスワップします)。ただし、この標準では、明示的な定義がない場合にコンパイラによる代入演算子の自動実装がすでに定義されているため、デフォルトの実装を変更すると、既存のコードが破損する可能性があります。

于 2010-05-14T01:13:55.990 に答える
1

一部のクラスを割り当てたり、コピーしたりすることを許可しない場合があるという理由からです。たとえば、RAIIを使用すると、ロックを開き、有効期限が切れるとロックを閉じるミューテックスクラスを作成できます。そのようなクラスをコピーまたは割り当てることが許可されている場合は、関数スコープの外に渡すことができると考えられます。これは悪い人の手に悪いことを引き起こす可能性があります。

于 2010-05-14T02:52:21.097 に答える