auto_ptr是否已被弃用?

87
  1. auto_ptr 在即将到来的 C++ 标准中是否会被弃用?
  2. 在所有权转移方面,是应该使用 unique_ptr 而非 shared_ptr 吗?
  3. 如果 unique_ptr 不在标准中,那么我需要使用 shared_ptr 吗?

值得一提的是,auto_ptr 在 C++17 中已被移除。请参阅 ISO/IEC JTC1/SC22/WG21 N4190Updates to my trip report : Standard C++ - li ki
4个回答

89
更新:本答案是在2010年写的,如预期,std::auto_ptr已被弃用。建议仍然有效。
在C++0x中,std::auto_ptr将被std::unique_ptr取代。智能指针的选择取决于您的使用情况和要求,对于单一所有权并且可以在容器内(使用移动语义)使用的情况,请使用具有移动语义的std::unique_ptr;对于共享所有权的情况,请使用std::shared_ptr。
应尽量选择最适合情况的智能指针,选择正确的指针类型可以让其他程序员了解您的设计。请注意保留HTML标记。

23

是的,截至今天,在C++0x中auto_ptr已被弃用,应该使用unique_ptr代替。根据最新的草案标准(n3035),第D.9节

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

在标准得到批准之前,委员会可能会修改这个决定,尽管我认为这种情况不太可能发生。


20
< p>不仅 auto_ptr在C++11 (D.10, page 1228)中已被弃用,它将在未来版本的C ++中被删除

采纳N4190,实际上从C++标准库中删除了(而不仅仅是弃用)几个过时的东西,包括auto_ptrbind1st/bind2ndptr_fun/mem_fun/mem_fun_refrandom_shuffle等。这些内容现在已经从草案C++17标准库中删除,并且不会成为未来可移植的C++的一部分。

另一个相关文档: Programming Language C++, Library Evolution Working Group - Document N4190, 如果你需要更多信息。

您可以通过使用unique_ptr来代替auto_ptr将任何代码自动转换:

可以机械地将使用auto_ptr的任何代码转换为使用unique_ptr,并在每次“复制”auto_ptr时插入move()


1

不,它并没有被废弃。如果C++0x被接受,它可能会被废弃。但实际上,它将一直得到支持。我认为任何被废弃的功能都从未在实际的C++实现中被删除。


5
C++标准只更新过一次,而那次更新基本上只是技术勘误(即修正已被引用的问题)。所以它没有移除任何东西并不奇怪。另一方面,旧特性最终会从编译器中删除。例如,更多的C++可能使用了<iostream.h>而不是auto_ptr,但例如微软VC++就不再提供这个库了。 - Jerry Coffin
1
@Jerry iostream.h从未成为任何标准的一部分。因此,它并没有被弃用。 - anon
2
@Jerry 嗯,我经常使用auto_ptr,但根本不使用iostream.h。有时我认为C++标准委员会在废弃方面有点过度。有些东西,例如原始字符串流显然是错误的,但其他一些东西,例如使用无名称命名空间而非完全可用的"static"关键字的想法是(并且仍然是)完全疯狂的。 - anon
1
@Neil:好的,让我们试着客观地看待这个问题。无论我个人做什么,考虑到用谷歌搜索"<iostream.h>"会得到大约263,000个结果,而搜索auto_ptr则会得到大约66,000个结果。 - Jerry Coffin
C++11有很多变化,比如新的auto关键字的使用与旧编译器不兼容。 - Richard Chambers
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接