shared_ptrのへのconst shared_ptrの
-
19-09-2019 - |
質問
どのようにして非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_pointer_cast」をあなたが求めているものを行うが、その答えの義務後半は、おそらくそれを使用してはならないことであるだろう。あなたは、変数のconstの性質を離れてキャストする必要があるようにそれはそう時間の99%が、それはあなたが設計上の欠陥を有することを意味します。 constのドレッシングと、予期しないバグにつながる可能性があり、それを離れてキャストするだけのウィンドウよりも、時にはそれ以上である。
あなたの状況の詳細を知らなくても1は確かに言うことはできません。しかし、constのキャストについての議論は、この事実を言及なしで完全ではありません。
他のヒント
boost::const_pointer_cast
、ドキュメントを使用しています。に
の適切な方法は、これをする必要があります。
boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
std::const_cast_pointer
は、第二の管理ポインタになります。キャスト後には、書き込み可能なポインタとの元のconstポインタを持っています。指示先は同じまま。参照カウントが1増加されています。
const_cast
は組み込みのキーワードですが、名前空間const_pointer_cast
でテンプレート機能がstd
であることに注意してください。
書き込み可能なポインタは、次にshared_ptr<const T>
下から値を変更するために使用することができます。書き込み可能なポインタ私見のみスタック上に一時的に持続するべきです。それ以外の場合は設計上の欠陥が存在する必要があります。
私はかつて私はこのスレッドに適合し自分自身にこれを明確にする小さなテストプログラムを書いてます:
#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