如何將指向const對象的shared_ptr轉換爲指向非const對象的shared_ptr。 我試圖做到以下幾點:const shared_ptr to 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。 我試圖做到以下幾點:const shared_ptr to 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-cast的討論是完整的。
使用boost::const_pointer_cast
,documentation.
的正確方法應該是這樣的
boost::shared_ptr<A> kk (boost::const_pointer_cast<A>(Ckk));
std::const_cast_pointer
產生第二個託管指針。在演員陣容之後,你有一個可寫指針和原始的常量指針。指出者保持不變。引用計數已增加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
「打印3」 - 3從哪裏來?這是一個錯字嗎? – 2011-10-20 10:35:48
+1是常量是有原因的。也許。 – 2009-12-18 04:31:20
使用'const_pointer_cast'並不是比您估計的更頻繁的設計缺陷。例如,標準容器只能操作可轉換爲所包含元素類型的類型。所以即使邏輯上正確,以下也是不可能的:'vector> cont; shared_ptr a; cont.push_back(a);' –
2011-06-02 16:12:27
@ jons34yp:沒有什麼邏輯上正確的。你被給了一個_const_指針;這意味着你不能以非常量的方式使用它。如果你有一個非const指針的列表,並且你想在其中放置一個const指針,那麼很難。通過強制轉換它,你違反了給那個指針的那個人的合同(那個合同就是你不想改變它)。對於常規指針,這與shared_ptr的情況一樣。 – 2011-07-15 06:01:55