18

const オブジェクトを指す shared_ptr を非 const オブジェクトを指す shared_ptr に変換するにはどうすればよいですか。私は次のことをしようとしています:

boost::shared_ptr<const A> Ckk(new A(4));

boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;

しかし、うまくいきません。

4

4 に答える 4

31

'boost :: const_pointer_cast'はあなたが求めていることを実行しますが、答えの必須の後半はおそらくそれを使用すべきではないということです。変数のconstプロパティを破棄する必要があると思われる場合の99%は、設計上の欠陥があることを意味します。Constは、単なるウィンドウドレッシング以上のものであり、それをキャストすると、予期しないバグが発生する可能性があります。

あなたの状況の詳細を知らなければ、確実に言うことはできません。しかし、この事実に言及せずにconst-castの議論は完全ではありません。

于 2009-12-16T20:16:35.523 に答える
10

使用boost::const_pointer_castドキュメント。

于 2009-12-16T09:01:53.033 に答える
2

std::const_cast_pointer2 番目のマネージ ポインターを作成します。キャスト後、書き込み可能なポインター元の const ポインターが得られます。指差し先はそのままです。参照カウントが 1 増加しました。

const_castこれは組み込みのキーワードですがconst_pointer_cast、 namespace のテンプレート関数であることに注意してくださいstd

その後、書き込み可能なポインターを使用して、 の下から値を変更できますshared_ptr<const T>。IMHO書き込み可能なポインターは、スタック上で一時的にのみ保持する必要があります。そうでなければ、設計上の欠陥があるに違いありません。

私はかつて、これを自分自身に明確にするために、このスレッドに適用した小さなテスト プログラムを作成しました。

#include <memory>
#include <iostream>
#include <cassert>

using namespace std;

typedef shared_ptr<int> int_ptr;
typedef shared_ptr<const int> const_int_ptr;

int main(void)
{
    const_int_ptr Ckk(new int(1));

    assert(Ckk.use_count() == 1);
    cout << "Ckk = " << *Ckk << endl;

    int_ptr kk = const_pointer_cast<int>(Ckk); // obtain a 2nd reference
    *kk = 2;                   // change value under the const pointer

    assert(Ckk.use_count() == 2);
    cout << "Ckk = " << *Ckk << endl;      // prints 3
}

UNIX または Windows/Cygwin では、次のようにコンパイルします。

g++ -std=c++0x -lm const_pointer_cast.cpp
于 2011-09-07T07:32:10.423 に答える
2

適切な方法はこれであるべきです

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
于 2009-12-16T09:18:34.447 に答える