const shared_ptr到shared_ptr

时间:2009-12-16 08:50:20

标签: boost shared-ptr

如何将指向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 个答案:

答案 0 :(得分:30)

'boost :: const_pointer_cast'会做你想要的,但答案的后半部分是你可能不应该使用它。 99%的时候,你似乎需要抛弃一个变量的const属性,这意味着你有一个设计缺陷。 Const有时不仅仅是装饰窗户而且将其抛弃可能会导致意外的错误。

在不了解您的情况的更多细节的情况下,我不能肯定地说。但是,如果没有提到这个事实,就不会讨论const-cast。

答案 1 :(得分:9)

使用boost::const_pointer_castdocumentation.

答案 2 :(得分:2)

正确的方法应该是这个

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

答案 3 :(得分:2)

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