문제

const 객체를 const 객체를 shared_ptr로 가리키는 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, 선적 서류 비치.

올바른 방법은 이것입니다

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));

std::const_cast_pointer 두 번째 관리 포인터를 만듭니다. 캐스트 후에는 쓰기 가능한 포인터가 있습니다 그리고 원래 Const-Pointer. 지점은 동일하게 유지됩니다. 기준 수는 1만큼 증가했습니다.

주목하십시오 const_cast 내장 키워드이지만 const_pointer_cast 네임 스페이스의 템플릿 기능입니다 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top