Позволяет рассмотрят следующий фрагмент кода:Скользящей семантика unique_ptr
template<typename T>
void f(std::unique_ptr<T>&& uptr) { /*...*/ }
В другой функции:
void g()
{
std::unique_ptr<ANY_TYPE> u_ptr = std::make_unique<ANY_TYPE>();
f(std::move(u_ptr));
X: u_ptr->do_sth(); // it works, I don't understand why. Details below.
}
Я не понимаю, почему u_ptr
в линии X
все еще жив. В конце концов, я заставил его двигаться (std :: move).
---EDIT---
Ok, so now:
The code is still working:
class T{
public:
T(){}
void show(){
std::cout << "HEJ!\n";
}
};
void f(std::unique_ptr<T> ref){
ref->show();
}
int main()
{
std::unique_ptr<T> my;
my->show();
f(std::move(my));
my->show(); // How is it possible. Now, f takes unique_ptr by value
return 0;
}
Но почему он не двигал указателем? Должен ли он называться move_constructors для функции вызова? – Gilgamesz
Вы передали 'unique_ptr' по ссылке. Переместить конструкцию нечего. Если вы хотите вызвать конструктор перемещения, вам нужно передать значение 'unique_ptr' по значению, а не по ссылке. Затем вы можете перемещать конструкцию этого значения. –
* Теперь * ваш код имеет неопределенное поведение. Попробуйте вызвать виртуальную функцию или получить доступ к члену, значение которого изменяется деструктором. (Вы делаете это дважды, так как 'my' никогда не ссылается на' T'.) –