2017-02-09 2 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

Смежные вопросы