Why aren't moving semantics applied here?
Because it is objnot a local variable, therefore, the language does not allow them to move implicitly.
, std::move:
std::unique_ptr<Obj> GetPtr() { return std::move(obj); }
, , , , , (.. this->obj ), . MovePtr.
GetPtr , this->obj , .. :
Obj* GetPtr() const { return obj.get(); }