【发布时间】:2016-03-16 15:15:19
【问题描述】:
当我需要一个类型为 std::unique_ptr 的数据成员时,我通常使用 std::unique::reset 来用新对象初始化这个 unique_ptr。
下面是一个简化的例子:
class A {
public:
void SetValue(int x) {
data_.reset(new B(x));
}
private:
std::unique_ptr<B> data_;
};
在代码审查中,一位审阅者提到这是一个坏习惯,并要求我尽可能不要使用重置。相反,他建议使用以下方法:
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()之间引入一些操作。在这一点上,仅仅是“难闻的气味”就成了问题。 -
当您调用
reset时,您并未初始化。您正在更改已存在对象的状态。不初始化一个没用的未初始化对象是没有意义的。 -
@chris 这是标准习语的目的,
make_unique<> -
尊敬的原始提问者:您应该将标签更改为 C++14 问题,因为 C++11 没有
make_unique -
投票重新开放。对于“在上述情况下是否有一些特殊原因可以避免使用 std::unique_ptr::reset ?”这一问题,有客观事实的答案?
标签: c++ c++14 unique-ptr