2012-02-06 87 views
13

是否有原因unique_ptr::reset没有超过一个const deleter&deleter&&以匹配其构造函数,将它们作为第二个参数?为什么unique_ptr :: reset没有带删除器的重载?

unique_ptr中存储的删除者将被复制分配或移动分配参数reset。如果删除器不可复制或不可移动,则调用reset的相应超载将不会编译。这似乎是与构造函数一致的行为。

回答

24

我想了想补充说,但你可以得到一招赋值运算符等效功能:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

所以我选择了在保持API相当小的利益,不是说用reset同样的事情。

更新

我的生活和学习...

的语法可能会比简单多了什么,我看到前面:

ptr = {new T(another_value), D(another_state)}; 
+3

+1对于“为什么”问题拥有唯一的_权威答案。 – ildjarn 2012-02-06 21:25:44

+0

如果有重置功能,它不会更干净和更符合shared_ptr吗?对我来说,当你有一个自定义删除功能时,感觉特别清晰。例如:'ptr = unique_ptr (new_raw_ptr,deleter_function);'vs'ptr.reset(new_raw_ptr,deleter_function);'。或者如果我们可以保持相同的deleter_function,那么它会更好,所以它会像:'ptr.reset(new_raw_ptr);'。 – felipou 2014-09-19 09:09:46

+1

@felipou:后者有效。对于前者,你可以如何实现它:http://cplusplus.github.io/LWG/lwg-active.html#submit_issue – 2014-09-19 14:35:23

3

因为在施工时删除器存储在对象中。由于删除器类型是模板参数,因此在构建之后无法“转换”类以使用另一个类。

+0

所以,调用拷贝赋值运算符或分别移动赋值运算符。如果你的删除器没有可接受的可访问的,它不会编译。 – David 2012-02-06 21:07:46

+0

这不是为了达到简单的目的而过度工作吗? – 2012-02-06 21:12:58

+0

您可以复制构造和移动构造 - 为什么添加复制赋值和移动赋值的能力是过度工程?这似乎是一个与我的其他功能一致的复杂度级别(也就是说,根本不复杂) – David 2012-02-06 21:15:16

相关问题