C++ std:.auto_ptr或std :: unique_ptr(支持多个编译器,甚至是旧的C++ 03编译器)?

2 c++ smart-pointers c++11 c++03

我正在尝试更新一些C++代码,我想转向更现代的代码(c ++ 11),但我仍然需要使用一些较旧的编译器(符合c ++ 03)编译代码,因为支持的平台约束.

我知道在C++ 11编译器中不推荐使用std :: auto_ptr,但由于编译器支持较旧,我不能只用std :: unique_ptr替换它们.

有没有一个很好的做法来处理这个"旧的编译器支持,但是开始转向C++ 11"?

roa*_*alz 5

如您所述,std :: auto_ptr <>已在C++ 11(参考)中弃用.

转移到c ++ 11 std :: unique_ptr <>是正确的方法,正如Herb Sutter在 GotW89中所述:

  1. 与auto_ptr有什么关系?
    auto_ptr最为慈善的特征是在C++移动语义之前创建unique_ptr的勇敢尝试.auto_ptr现已弃用,不应在新代码中使用.
    如果您在现有代码库中有auto_ptr,那么当您有机会尝试将auto_ptr全局搜索并替换为unique_ptr时; 绝大多数用途都是相同的,它可能会暴露(作为编译时错误)或修复(默默地)你不知道的一两个错误.

另请注意,C++ 17将删除std :: auto_ptr.

我认为可能有不同的方法来解决您的问题,"正确的"也取决于您的实际代码是如何编写的.
一些选择是:

选项1

使用boost :: unique_ptr

选项2

有条件地使用基于__cplusplus的auto_ptr或unique_ptr.

class Myclass {
#if __cplusplus <201103L
std :: auto_ptr m_ptr;
#else
std :: unique_ptr m_ptr;
#endif
...

这将分散在你引用auto_ptr的每个地方,我真的不喜欢它.
如果你对std :: auto_ptr的所有引用都已经是typedef'(只是有条件地改变了typedef),可能看起来不那么尴尬了.

选项3

有条件地使用using和aliasing来"定义"auto_ptr(并在没有std :: namespace的情况下引用它).

#if __cplusplus <201103L
使用std :: auto_ptr; 使用auto_ptr = std :: unique_ptr的
#else
模板
;
#万一

缺点:你继续使用"auto_ptr",但在c ++ 11中它意味着std :: unique_ptr.
真的很混乱......

选项3.1

可能略好于选项2:
使用别名反转并更喜欢unique_ptr名称.

选项4

将std :: smart指针(有条件地为auto_ptr或unique_ptr)包装在您自己定义的模板智能指针类中.
这可能很麻烦,需要使用新类搜索和替换所有auto_ptr引用.

其他脏选项

其他选项涉及std :: namespace中的定义,我认为这是标准所禁止的,
或者使用预处理器#define来... ehm ...将"unique_ptr"重命名为auto_ptr仅适用于旧的C++ 03编译器.