2013-07-01 54 views
0

升壓文檔說c + +升壓:: shared_ptr的操作符[]細節

與升壓釋放1.53開始,shared_ptr的可用於一個 指針保持到動態分配的數組。

我有一個簡單的類,並使用boost::shared_ptr在其內保持的std::deque數組:

boost::shared_ptr<std::deque<uint32_t> []> someArray; 

我想有一個方法,從數組中返回指定雙端隊列爲只讀:

std::deque<uint32_t> MyClass::myMethod(boost::uint32_t arrayIndex) const{    
     return someArray[arrayIndex]; 
} 

這種方法不違反對象的恆定性嗎?

+1

std :: deque 不是數組 –

+2

這個'boost :: shared_ptr < std :: deque >'只是一個指向deque的共享指針,它不是指向deques數組的共享指針。 – juanchopanza

+0

對不起,確定這是一個文字錯誤。我的意思是同樣的結構我會編輯我的問題 – vard

回答

3

這種方法不違反對象的恆定性嗎?

是的。也許。 它顯然不影響句法恆定性,因爲編譯器不會抱怨。這是因爲語法恆定性要求對象及其成員(在本例中尤其是智能指針)爲const。它確實需要指針對象(即deques數組)爲而不是爲const。
語義不變性是另一回事。如果數組屬於你的對象,改變數組意味着改變對象,並且使對象爲const意味着不改變數組。您需要強制執行不是句法常量的語義常量。但是,在這種情況下,我不會使用shared_ptr,而是使用std::vector,因爲這表示單一所有權,而shared_ptr是共享所有權 - 顯然,這是共享所有權。此外,std::vector旨在強制執行語義恆定性,這意味着庫實現者將包含的元素強制爲const向量中的常量。
但是,由於我不知道你的類和deque數組的背景,並且因爲你使用了明確表示共享所有者的shared_ptr,所以你需要語義常量,也許不需要。

但是既然你說你想要一個只讀的訪問權限,並且你按值返回,那麼訪問不會改變數組的內容,你可能會好。通過const引用返回也可以做你想要的東西,再加上它可以避免不必要的臨時副本,這可能會相當昂貴,具體取決於出列對象的存儲數量。

+0

對不起,我不應該再問一個問題,從我腦海中編寫代碼。當然,我的意思是[]和std :: deque作爲方法的返回類型。我帶來了我的道歉。我將編輯我的問題。 – vard

+0

@vard好的,我從我的答案中刪除了這些部分,我希望我留下了回答你問題的答案。 –

+0

謝謝,是的,你做到了。 – vard