0

したがって、実際に書き込みを行うクラスへのポインターを所有する出力ストリーム クラスがあり、特定の値をユーザーに透過的にバインドできるように、関数から初期化されたインスタンスを返すことができるコピー コンストラクターが必要です。合理的なコピー セマンティクスを実現するために、コピーされたオブジェクトのライター ポインターをクリアし、それを閉じてコピー中に使用できないようにしたいと考えています。

非 const コピー コンストラクター a-la を使用すると、問題なく実行できます。

class Test {
  public:
    Test(Test& other);
};

しかし、関数呼び出しによって返された一時から直接割り当てることができるようにしたい:

Test test = make_test();

コピー コンストラクターは const である必要があります。したがって、コピー コンストラクターで const_cast を使用することの意味に興味があります。他の参照を非 const ポインターにキャストし、言及したライター ポインターをクリアします。const_cast は一般的に悪と見なされていることは知っていますが、この場合は機能しますか? 関数呼び出しから返された一時オブジェクトとどのように相互作用するのか、特に興味があります。

あるいは、コピー コンストラクターにアクセスしたい作成関数は 4 つしかありません。それらの関数 (戻り値を含む) のみが使用できるようにスコープを設定する合理的な方法があれば、それを好むでしょう。

4

3 に答える 3

3

ミュータブルの仕事のように聞こえます:

struct A {

    A() : x(0) {}

    A( const A & a ) : x( a.x ) {
       a.x = 0;
    }

    mutable int x;
};

int main() {
    A a1;
    A a2 = a1;
}
于 2010-07-04T09:31:06.243 に答える
2

const コピー コンストラクターを破壊的にすることで、オブジェクトのパブリック コントラクトとクライアント コードの期待に違反することになります。

それ以外は、パラメータの constness を削除しても問題ありません。

于 2010-07-04T03:18:24.163 に答える
1

std::auto_ptrコピー コンストラクターも元のオブジェクトを変更するため、 の実装を確認することをお勧めします。

しかし、このセマンティックがまさに多くの人が を嫌う理由であることに注意してstd::auto_ptrください。

于 2010-07-04T09:24:10.203 に答える