2012-05-05 50 views
1

這個問題延伸以前post討論的boost::shared<T>&用處構造函數參數:目的的shared_ptr <T> &&作爲構造函數參數的

class SomeClass { 
    SomeClass(const boost::shared_ptr<SomeOtherClass>&); 
} 

會在地方boost::shared_ptr<T>&提供任何利益的右值引用參數?

class SomeClass { 
    SomeClass(const boost::shared_ptr<SomeOtherClass>&&); 
}  

特別地,對於多線程設置,將與shared_ptr的類型的右值基準的構造是任意的更加有用然後傳遞按值或傳遞通過引用?

+3

如果您採用右值引用,可以將'shared_ptr'移動到內部成員中,而不是複製它。複製'shared_ptr'會導致它增加引用計數,這比最初想象的要貴得多。注意當複製'shared_ptr'時線程安全,移動一個不是。 –

回答

4

shared_ptr並不特殊。幾乎任何其他對象都適用相同的規則。你會做一個const rvalue參考參數嗎?我看不到任何有效的理由。關於其他類的右值引用呢?除了在類自己的移動構造函數和移動賦值操作符中,大多數情況下,您不應該通過右值引用來獲取對象。如果你需要的對象的副本,然後你把它按價值,移動它,就像這樣:

class SomeClass { 
    std::shared_ptr<SomeOtherClass> myptr; 
public: 
    SomeClass(std::shared_ptr<SomeOtherClass> yourptr) 
     :myptr(std::move(yourptr)) 
    {} 
}; 

如果您不需要複製,然後你把它用在如果你的意圖常量引用只是爲了檢查它,或者如果你打算修改它,就是正常的參考。

如果您要承諾不會修改指向的對象,則可以接受const std::shared_ptr<const SomeOtherClass> &,即使該參數沒有內部const限定符,也可以工作。

+0

如果你想強調你正在接管某些東西,我認爲右值ref參數是完全可以接受的。 – Xeo

+0

@Xeo:如果你通過價值觀進行論證並將其移動,那麼你*就擁有了它的所有權。 –

1

有沒有目的const右值。但是,通過價值轉讓可以更快地轉移所有權,因爲只有交換是必要的。

0

我不確定有什麼這樣的東西作爲const rvalue引用,我不知道它會是什麼意思。當它到達函數並且有一個名字時,它與const lvalue引用基本上是一樣的(如果它有一個名字,那麼它就是一個左值)。你不會被允許移動它。

我不確定在呼叫站點會有什麼意思......如果有的話。當然,這隻會讓人迷惑地走出困境,所以簡直就是壞事。

坦率地說,如果編譯出來,我會有點惱火。我不能說這是非法的。

現在,擺脫const部分,你有一個不同的故事。現在你可以「移動」shared_ptr。我相當懷疑,雖然shared_ptr有一個移動構造函數,但也許它確實。這意味着移動總是意味着:接收實體可能接管提供的變量,可能會破壞它。

+0

有一個常量右值引用這樣的事情,但它是無用的。 –

相關問題