2017-02-09 28 views
6

鑑於移動一個shared_ptr來調用的對象上的shared_ptr點的方法

struct X { 
    void f(std::shared_ptr<X>); 
}; 
auto x(std::make_shared<X>()); 

我也許可以安全地在做

x->f(std::move(x)); 

C++ 17,因爲x->f的參數X::f之前評估是建造的,對吧?據我所知,在早期版本的C++中沒有這樣的保證。我如何在C++ 11和C++ 14中實現類似的功能?

PS:注意即使使用std::unique_ptr代替std::shared_ptr也是如此。

+0

這也意味着這個問題是否可以安全地銷燬對象在同一個對象的成員函數的範圍之內/之內。出於好奇:你爲什麼想這麼做? – Pixelchemist

回答

4

我認爲最好的一個可以做C++ 11和C++ 14在不改變接口或使用任何不起眼的宏是

auto & refX = *x; 
refX.f(std::move(x)); 
+0

嚴格地說,你只需要在解引用x和調用f對象之間引入一個序列點。這提供了一個非常可讀的解決方案。 – WorldSEnder