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¶
指定使用哪个包含样式的字符串,llvm 或 google。 默认值为 llvm。