如何将指向 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 对象的 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;
但它不起作用。
'boost::const_pointer_cast' 会做你要求的,但答案的后半部分是你可能不应该使用它。99% 的情况下,您似乎需要抛弃变量的 const 属性,这意味着您存在设计缺陷。Const 有时不仅仅是装饰门面,将其丢弃可能会导致意想不到的错误。
在不了解您的情况的更多细节的情况下,无法肯定地说。但是如果不提及这个事实,对 const-cast 的讨论是不完整的。
使用boost::const_pointer_cast
,文档。
正确的方法应该是这样
boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
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