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