質問

どのようにして非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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top