我有抽象类Managee和helper类Wrapper。用于构建Wrapper的Managee指针,然后Wrapper将取得Managee的所有权。我想确保用户始终分配新的Managee。 rvalue-references是否适合这个目标?
包装器定义:
...
Wrapper(Managee * && tmpptr);
Managee & GetManagee();
...
包装用法:
Wrapper a(new ManageeA()); // ok;
Wrapper b(&a.GetManagee()); // error? <-----
答案 0 :(得分:3)
Rvalue-references不提供帮助,因为&a.GetManagee()
是一个右值。
为什么不选择std::unique_ptr
?
Wrapper(std::unique_ptr<Managee> ptr)
: member_ptr(std::move(ptr)) {}
Managee& GetManagee();
用法:
Wrapper a(make_unique<Managee>(/*args*/));
对于make_unique
,请参阅here。
然而,最好的解决方案甚至不允许用户在堆栈上创建Managee
派生类型 - 这可以通过工厂函数完成(当然用{ {1}})并使构造函数成为私有的:
std::unique_ptr