2009-12-16 92 views
16

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

但它不工作。

回答

30

「的boost :: const_pointer_cast」會做你問什麼,但答案的強制性下半年是你可能不應該使用它。當你需要拋棄一個變量的const屬性時,99%的時間,這意味着你有一個設計缺陷。康斯坦丁有時候不僅僅是裝飾窗戶,而是將它拋棄,可能會導致意外的錯誤。

不知道你的情況的更多細節,人們不能肯定地說。但是沒有提到這個事實,沒有關於const-cast的討論是完整的。

+2

+1是常量是有原因的。也許。 – 2009-12-18 04:31:20

+1

使用'const_pointer_cast'並不是比您估計的更頻繁的設計缺陷。例如,標準容器只能操作可轉換爲所包含元素類型的類型。所以即使邏輯上正確,以下也是不可能的:'vector > cont; shared_ptr a; cont.push_back(a);' – 2011-06-02 16:12:27

+10

@ jons34yp:沒有什麼邏輯上正確的。你被給了一個_const_指針;這意味着你不能以非常量的方式使用它。如果你有一個非const指針的列表,並且你想在其中放置一個const指針,那麼很難。通過強制轉換它,你違反了給那個指針的那個人的合同(那個合同就是你不想改變它)。對於常規指針,這與shared_ptr的情況一樣。 – 2011-07-15 06:01:55

2

的正確方法應該是這樣的

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

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 
+0

「打印3」 - 3從哪裏來?這是一個錯字嗎? – 2011-10-20 10:35:48

相關問題