modernize-replace-auto-ptr

此检查将弃用类 std::auto_ptr 的使用替换为 std::unique_ptr(在 C++11 中引入)。 复制构造函数和赋值运算符执行的所有权转移将通过显式调用 std::move() 来更改,以匹配 std::unique_ptr 的用法。

迁移示例

-void take_ownership_fn(std::auto_ptr<int> int_ptr);
+void take_ownership_fn(std::unique_ptr<int> int_ptr);

 void f(int x) {
-  std::auto_ptr<int> a(new int(x));
-  std::auto_ptr<int> b;
+  std::unique_ptr<int> a(new int(x));
+  std::unique_ptr<int> b;

-  b = a;
-  take_ownership_fn(b);
+  b = std::move(a);
+  take_ownership_fn(std::move(b));
 }

由于 std::move() 是在 <utility> 中声明的库函数,因此可能需要添加此包含项。 检查将在必要时添加包含指令。

已知限制

  • 如果未激活标头修改或不允许更改标头,则此检查将产生错误代码(编译错误),其中标头代码将保持不变,而使用它们的代码将被更改。

  • 从无法迁移的代码(例如来自第三方库的标头)中声明对 std::auto_ptr 的引用的客户端代码在迁移后将产生编译错误。 这是因为引用的类型将更改为 std::unique_ptr,但库返回的类型不会更改,将对 std::unique_ptr 的引用绑定到 std::auto_ptr。 此模式没有多大意义,通常 std::auto_ptr 是按值存储的(否则使用它们而不是引用或指针有什么意义?)。

 // <3rd-party header...>
 std::auto_ptr<int> get_value();
 const std::auto_ptr<int> & get_ref();

 // <calling code (with migration)...>
-std::auto_ptr<int> a(get_value());
+std::unique_ptr<int> a(get_value()); // ok, unique_ptr constructed from auto_ptr

-const std::auto_ptr<int> & p = get_ptr();
+const std::unique_ptr<int> & p = get_ptr(); // won't compile
  • 未实例化的模板不会被修改。

template <typename X>
void f() {
    std::auto_ptr<X> p;
}

// only 'f<int>()' (or similar) will trigger the replacement.

选项

IncludeStyle

指定使用哪个包含样式的字符串,llvmgoogle。 默认值为 llvm