18

如何将指向 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

4 回答 4

31

'boost::const_pointer_cast' 会做你要求的,但答案的后半部分是你可能不应该使用它。99% 的情况下,您似乎需要抛弃变量的 const 属性,这意味着您存在设计缺陷。Const 有时不仅仅是装饰门面,将其丢弃可能会导致意想不到的错误。

在不了解您的情况的更多细节的情况下,无法肯定地说。但是如果不提及这个事实,对 const-cast 的讨论是不完整的。

于 2009-12-16T20:16:35.523 回答
10

使用boost::const_pointer_cast文档。

于 2009-12-16T09:01:53.033 回答
2

正确的方法应该是这样

boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
于 2009-12-16T09:18:34.447 回答
2

std::const_cast_pointer生成第二个托管指针。转换后,您有一个可写指针原始常量指针。指针保持不变。引用计数增加了 1。

请注意,这const_cast是一个内置关键字,但const_pointer_cast它是 namespace 中的模板函数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
于 2011-09-07T07:32:10.423 回答