可以进行移动构造和移动赋值操作,在函数中做为返回值使用
unique_ptr<int> print( ){ unique_ptr<int> a(new int(10)); return a;//局部变量 } unique_ptr<int> b=print(); //运行成功或者
unique_ptr<int> print( ){ return unique_ptr<int> (new int(10));//返回自身 } unique_ptr<int> b=print(); //运行成功
上面的操作有些类似move的做法,
unique_ptr<int> a(new int(10)); unique_ptr<int> b=std:move(a) ; //这里是显式的所有权转移,把a所指的内存转给b了,而a不再拥有该内存unique_ptr做为STL容器的元素时,不能直接进行传递,因为不可以进行拷贝和赋值操作.
vector<unique_ptr<int>> a; a.push_back(new int(20)); //错误 a.emplace_back(new int(20)); //错误 a.emplace_back(make_unique<int>(20)); //错误但可以通过move函数转换权限从而实现 ,
unique_ptr<int> a(new int(20)); vector<unique_ptr<int>> b; b.push_back(std::move(a)); //正确有一点值得注意的是:
unique_ptr做为STL容器的元素时,不能作为类的成员变量,
class a{ //省略 } class b{ private: vector<unique_ptr<int>> temp; //错误 vector<unique_ptr<a>> tmp; //错误 }可以实现拷贝和赋值,所以上面出现的错误都能运行。
vector<shared_ptr<int>> a; a.push_back(new int(20)); //成功 a.emplace_back(new int(20)); //成功 a.emplace_back(make_unique<int>(20)); //成功 class a{ //省略 } class b{ private: vector<shared_ptr<int>> temp; //成功 vector<shared_ptr<a>> tmp; //成功 }
