| .. title:: clang-tidy - readability-make-member-function-const |
| |
| readability-make-member-function-const |
| ====================================== |
| |
| Finds non-static member functions that can be made ``const`` |
| because the functions don't use ``this`` in a non-const way. |
| |
| This check tries to annotate methods according to |
| `logical constness <https://isocpp.org/wiki/faq/const-correctness#logical-vs-physical-state>`_ |
| (not physical constness). |
| Therefore, it will suggest to add a ``const`` qualifier to a non-const |
| method only if this method does something that is already possible though the |
| public interface on a ``const`` pointer to the object: |
| |
| * reading a public member variable |
| * calling a public const-qualified member function |
| * returning const-qualified ``this`` |
| * passing const-qualified ``this`` as a parameter. |
| |
| This check will also suggest to add a ``const`` qualifier to a non-const |
| method if this method uses private data and functions in a limited number of |
| ways where logical constness and physical constness coincide: |
| |
| * reading a member variable of builtin type |
| |
| Specifically, this check will not suggest to add a ``const`` to a non-const |
| method if the method reads a private member variable of pointer type because |
| that allows to modify the pointee which might not preserve logical constness. |
| For the same reason, it does not allow to call private member functions |
| or member functions on private member variables. |
| |
| In addition, this check ignores functions that |
| |
| * are declared ``virtual`` |
| * contain a ``const_cast`` |
| * are templated or part of a class template |
| * have an empty body |
| * do not (implicitly) use ``this`` at all |
| (see `readability-convert-member-functions-to-static <readability-convert-member-functions-to-static.html>`_). |
| |
| The following real-world examples will be preserved by the check: |
| |
| .. code-block:: c++ |
| |
| class E1 { |
| Pimpl &getPimpl() const; |
| public: |
| int &get() { |
| // Calling a private member function disables this check. |
| return getPimpl()->i; |
| } |
| ... |
| }; |
| |
| class E2 { |
| public: |
| const int *get() const; |
| // const_cast disables this check. |
| S *get() { |
| return const_cast<int*>(const_cast<const C*>(this)->get()); |
| } |
| ... |
| }; |
| |
| After applying modifications as suggested by the check, running the check again |
| might find more opportunities to mark member functions ``const``. |