| .. title:: clang-tidy - cppcoreguidelines-special-member-functions |
| |
| cppcoreguidelines-special-member-functions |
| ========================================== |
| |
| The check finds classes where some but not all of the special member functions |
| are defined. |
| |
| By default the compiler defines a copy constructor, copy assignment operator, |
| move constructor, move assignment operator and destructor. The default can be |
| suppressed by explicit user-definitions. The relationship between which |
| functions will be suppressed by definitions of other functions is complicated |
| and it is advised that all five are defaulted or explicitly defined. |
| |
| Note that defining a function with ``= delete`` is considered to be a |
| definition. |
| |
| This check implements `C.21 |
| <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-five>`_ |
| from the C++ Core Guidelines. |
| |
| Options |
| ------- |
| |
| .. option:: AllowSoleDefaultDtor |
| |
| When set to `true` (default is `false`), this check will only trigger on |
| destructors if they are defined and not defaulted. |
| |
| .. code-block:: c++ |
| |
| struct A { // This is fine. |
| virtual ~A() = default; |
| }; |
| |
| struct B { // This is not fine. |
| ~B() {} |
| }; |
| |
| struct C { |
| // This is not checked, because the destructor might be defaulted in |
| // another translation unit. |
| ~C(); |
| }; |
| |
| .. option:: AllowMissingMoveFunctions |
| |
| When set to `true` (default is `false`), this check doesn't flag classes |
| which define no move operations at all. It still flags classes which define |
| only one of either move constructor or move assignment operator. With this |
| option enabled, the following class won't be flagged: |
| |
| .. code-block:: c++ |
| |
| struct A { |
| A(const A&); |
| A& operator=(const A&); |
| ~A(); |
| }; |
| |
| .. option:: AllowMissingMoveFunctionsWhenCopyIsDeleted |
| |
| When set to `true` (default is `false`), this check doesn't flag classes |
| which define deleted copy operations but don't define move operations. This |
| flag is related to Google C++ Style Guide `Copyable and Movable Types |
| <https://google.github.io/styleguide/cppguide.html#Copyable_Movable_Types>`_. |
| With this option enabled, the following class won't be flagged: |
| |
| .. code-block:: c++ |
| |
| struct A { |
| A(const A&) = delete; |
| A& operator=(const A&) = delete; |
| ~A(); |
| }; |
| |
| .. option:: AllowImplicitlyDeletedCopyOrMove |
| |
| When set to `true` (default is `false`), this check doesn't flag classes |
| which implicitly delete copy or move operations. |
| With this option enabled, the following class won't be flagged: |
| |
| .. code-block:: c++ |
| |
| struct A : boost::noncopyable { |
| ~A() { std::cout << "dtor\n"; } |
| }; |