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;
しかし、うまくいきません。
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;
しかし、うまくいきません。
'boost :: const_pointer_cast'はあなたが求めていることを実行しますが、答えの必須の後半はおそらくそれを使用すべきではないということです。変数のconstプロパティを破棄する必要があると思われる場合の99%は、設計上の欠陥があることを意味します。Constは、単なるウィンドウドレッシング以上のものであり、それをキャストすると、予期しないバグが発生する可能性があります。
あなたの状況の詳細を知らなければ、確実に言うことはできません。しかし、この事実に言及せずにconst-castの議論は完全ではありません。
使用boost::const_pointer_cast
、ドキュメント。
std::const_cast_pointer
2 番目のマネージ ポインターを作成します。キャスト後、書き込み可能なポインターと元の 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
適切な方法はこれであるべきです
boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));