C++ 移动操作员未传递所有权

C++ 移动操作员未传递所有权,c++,move-semantics,C++,Move Semantics,节目 #include<iostream> using namespace std; struct abhi{ int a=2; int b=1; ~abhi(){cout<<"destroyed"<<endl;} }; void su(int a, int b, abhi&& ptr){ cout<<"yes"<<endl; } int main(){ abhi ptr

节目

#include<iostream>

using namespace std;

struct abhi{
int a=2;
int b=1;
~abhi(){cout<<"destroyed"<<endl;}
};

void  su(int a, int b, abhi&& ptr){
cout<<"yes"<<endl;
}

int main(){
abhi ptr;
su(1,2,move(ptr));
cout<<"after"<<endl;
}

当我使用
move
传递
ptr
时,是否应在
su
函数中调用析构函数。
我使用了
move
操作符和
unique\u ptr
,它用于完全传递所有权,因此我使用普通
指针得到不同的结果

您通过引用传递对象ptr(右值引用)。因此,两个析构函数都没有被调用,因为对象ptr不是一个临时对象。@Vladfromnow我正在传递右值引用,所以我的调用函数应该是一个常量,在这种情况下,
{}
或者使用
move
传递我的
ptr
作为右值移动
unique\u ptr
不会调用它的析构函数。你所观察到的并不是这样。我不明白为什么你希望移动你自己的类型来调用它的析构函数。您类型的所有权转移意味着什么?Vlad的观点仍然适用:
std::move
不会立即移动,它只是强制转换到右值引用,因此对象实际上是通过引用传递的。(移动操作对于您的类型也被完全禁用,因为您已经拼出了它的析构函数。)这是否回答了您的问题?您正在通过引用(右值引用)传递对象ptr。因此,两个析构函数都没有被调用,因为对象ptr不是一个临时对象。@Vladfromnow我正在传递右值引用,所以我的调用函数应该是一个常量,在这种情况下,
{}
或者使用
move
传递我的
ptr
作为右值移动
unique\u ptr
不会调用它的析构函数。你所观察到的并不是这样。我不明白为什么你希望移动你自己的类型来调用它的析构函数。您类型的所有权转移意味着什么?Vlad的观点仍然适用:
std::move
不会立即移动,它只是强制转换到右值引用,因此对象实际上是通过引用传递的。(移动操作对于您的类型也被完全禁用,因为您已经拼出了它的析构函数。)这是否回答了您的问题?
yes
after
destroyed