当我需要一个数据成员是
以下是一个简化的例子:
或者使用以下模板函数:
std::unique_ptr<A>
类型时,我通常使用std::unique::reset()
来初始化这个unique_ptr
指向一个新对象。以下是一个简化的例子:
class A {
public:
void SetValue(int x) {
data_.reset(new B(x));
}
private:
std::unique_ptr<B> data_;
};
在代码审查中,一位评审人员提到使用reset()
是一种不好的习惯,他建议我尽可能不要使用。相反,他建议使用以下方法:
std::make_unique
或者使用以下模板函数:
template <typename T>
struct MakeUniqueResult {
using scalar = std::unique_ptr<T>;
};
template <typename T, typename... Args>
typename internal::MakeUniqueResult<T>::scalar
MakeUnique(Args&&... args) {
return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
}
在上述情况下,有没有一些特殊的理由要避免使用 std::unique_ptr::reset()
?
new
和调用reset()
之间引入某些操作。此时,原本只是一个“坏味道”变成了一个问题。 - Richard Hodgesreset
时,你没有初始化。你是在改变一个已经存在的对象的状态。一个没有初始化的对象毫无意义,所以最好还是将其初始化。 - juanchopanzamake_unique<>
的目的。 - Richard Hodgesmake_unique
。 - TheCppZoo