auto_ptr是否已弃用?


81
  1. 在传入的C ++标准中将不赞成使用auto_ptr吗?
  2. 应该将unique_ptr而不是shared_ptr用于所有权转让吗?
  3. 如果unique_ptr不在标准中,那么我是否需要使用shared_ptr?

Answers:


77

更新:此答案写于2010年,并且std::auto_ptr已弃用。该建议是完全有效的。

在C ++ 0xstd::auto_ptr中,不推荐使用std::unique_ptr。智能指针的选择将取决于您的用例和要求,以及std::unique_ptr具有单个所有权的移动语义,该语义可以在容器内使用(使用移动语义)以及std::shared_ptr何时共享所有权。

您应该尝试使用最适合这种情况的智能指针,选择正确的指针类型可以使其他程序员深入了解您的设计。


22

是的,从今天起auto_ptr,C ++ 0x中将弃用该名称,而应unique_ptr改为使用。根据最新的标准草案(n3035),第D.9节

类模板auto_ptr已弃用。[注意:类模板unique_ptr(20.9.10)提供了更好的解决方案。—尾注]

在我批准该标准之前,委员会很有可能会修改此决定,尽管我认为该决定不太可能。


17

不仅auto_ptr不赞成在C ++ 11(D.10,1228页),它也将被删除, 在C ++的未来版本

采用N4190和实际删除(不只是不建议使用)几个古老的东西从C ++标准库,包括auto_ptrbind1st/ bind2ndptr_fun/ mem_fun/ mem_fun_refrandom_shuffle和几个。现在,所有这些都已从C ++ 17标准库草案中删除,并且不会成为将来的可移植C ++的一部分。

与此相关的另一文档:如果需要更多信息,请参见C ++编程语言,库演化工作组-N4190文档

您可以使用以下方式auto_ptr自动转换任何代码unique_ptr

auto_ptr可以将任何代码using机械地转换为using unique_ptrmove()只要auto_ptr在“复制”时插入即可。


3

不,它不被弃用。如果C ++ 0x被接受,可能是这样。实际上,它将始终得到支持。我不认为任何不推荐使用的功能都没有从实际的C ++实现中删除。


5
C ++标准仅更新一次,基本上只是技术上的更正(即,解决了已被引用的问题)。没有删除任何内容也就不足为奇了。OTOH,旧功能最终确实会从编译器中删除。仅举例来说,可能使用的C ++<iostream.h>比以前更多auto_ptr,但是MS VC ++(仅此一种)不再提供它。
杰里·科芬

1
@Jerry iostream.h从未成为任何标准的一部分。因此,它不被弃用。

@Neil:没有,但是用了很多auto_ptr是标准的一部分,但使用量大大减少。从实际的角度来看,将其删除将大大减少影响。
杰里·科芬

2
@Jerry好吧,我经常使用auto_ptr,而根本不使用iostream.h。有时,我认为C ++标准的支持者在弃用方面会有些不便。有些事情,例如原始的字符串流显然是错误的,但是其他一些事情,例如,使用无名命名空间而不是完全可用的“ static”关键字的想法完全是傻瓜。

1
@Neil:好吧,让我们尝试透视一下。不管您我个人做什么,都认为Google搜索“ <iostream.h>”会产生〜263'000的命中,而执行auto_ptr的结果会达到〜66'000的命中。
杰里·科芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.