如何将指向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;
但它不起作用。
答案 0 :(得分:30)
'boost :: const_pointer_cast'会做你想要的,但答案的后半部分是你可能不应该使用它。 99%的时候,你似乎需要抛弃一个变量的const属性,这意味着你有一个设计缺陷。 Const有时不仅仅是装饰窗户而且将其抛弃可能会导致意外的错误。
在不了解您的情况的更多细节的情况下,我不能肯定地说。但是,如果没有提到这个事实,就不会讨论const-cast。
答案 1 :(得分:9)
使用boost::const_pointer_cast
,documentation.
答案 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