std::unique_ptr<>
初始化:直接初始化、右值赋值、std::move
作为函数返回值
作为函数形参
#include <iostream>
using namespace std;
class Base{
public:
    Base(int val=0) : val_(val){
        cout << "Base ctor  " << val_ << "\n"; 
    }
    ~Base()
    {
        cout << "------------------------Base dctor  " << val_ << "\n"; 
    }
    void GetVal()
    {
        cout << "val is " << val_;
        cout << "\n\n";
    }
private:
    int val_;
};
std::unique_ptr<Base> GetBase(int n){
    std::unique_ptr<Base> base;
    base.reset(new Base(n));
    return std::move(base);
}
int main(){
    
    //std::unique_ptr<Base> pBase(std::move(GetBase()));
    //auto pBase = GetBase();
    //unique_ptr初始化:直接初始化、右值赋值、std::move
    std::unique_ptr<Base> pBase1(new Base(1));
    std::unique_ptr<Base> pBase2(new Base(2));
    //unique_ptr是返回值
    std::unique_ptr<Base> pBase3;
    pBase3 = GetBase(44);
    pBase1 = GetBase(55);
    //pBase3 = std::unique_ptr<Base>(new Base(3)); //rvalue
    std::unique_ptr<Base> pBase4;
    pBase4 = std::move(pBase1);  //std::move
    Base* base = pBase1.get();
    //unique_ptr作为形参,一般是通过std::move移交转移权
    //unique_ptr release():释放指针独占权,返回指向对象的指针,并将内部指针设为null
    //unique_ptr reset():释放指针独占权,回收对象内存,无返回值
    base = pBase2.release();
    delete base;
    Base *base2 = pBase2.get();
    //pBase2 = std::move(pBase1);
    //pBase1.reset(pBase2.get());
    
}