| .. index:: Replace-AutoPtr Transform |
| |
| ========================= |
| Replace-AutoPtr Transform |
| ========================= |
| |
| The Replace-AutoPtr Transform replaces the uses of the deprecated class |
| ``std::auto_ptr`` by ``std::unique_ptr`` (introduced in C++11). The transfer of |
| ownership, done by the copy-constructor and the assignment operator, is changed |
| to match ``std::unique_ptr`` usage by using explicit calls to ``std::move()``. |
| The transform is enabled with the :option:`-replace-auto_ptr` option of |
| :program:`clang-modernize`. |
| |
| Migration example: |
| |
| .. code-block:: c++ |
| |
| -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)); |
| } |
| |
| |
| Known Limitations |
| ================= |
| * If headers modification is not activated or if a header is not allowed to be |
| changed this transform will produce broken code (compilation error), where the |
| the headers' code will stay unchanged while the code using them will be |
| changed. |
| |
| * Client code that declares a reference to an ``std::auto_ptr`` coming from code |
| that can't be migrated (such as a header coming from a 3\ :sup:`rd` party |
| library) will produce a compilation error after migration. This is because the |
| type of the reference will be changed to ``std::unique_ptr`` but the type |
| returned by the library won't change, binding a reference to |
| ``std::unique_ptr`` from an ``std::auto_ptr``. This pattern doesn't make much |
| sense and usually ``std::auto_ptr`` are stored by value (otherwise what is the |
| point in using them instead of a reference or a pointer?). |
| |
| .. code-block:: c++ |
| |
| // <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 |
| |
| * Non-instantiated templates aren't modified. |
| |
| .. code-block:: c++ |
| |
| template <typename X> |
| void f() { |
| std::auto_ptr<X> p; |
| } |
| |
| // only 'f<int>()' (or similar) will trigger the replacement |