C++ has several special member functions that are defined by the compiler even if not defined by the user. These special member functions are the default constructor, the copy constructor, the copy assignment operator, the move constructor, the move assignment operator, and the destructor. However, there are many rules for what is defined and in which circumstances. For instance, if no special member function is defined by the user then all of them are implicitly defined by the compiler. On the other hand, if a copy constructor or copy assignment operator is defined by the user, then the move constructor and move assignment operator are not defined by the compiler. To make it easier to comprehend all the rules, the following table describes what is defined by the compiler based on what is defined by the user.
|Default constructor||Copy constructor||Copy operator=||Move constructor||Move operator=||Destructor|
In the table above, on the horizontal, we have the special member functions that the compiler defines and on the vertical the functions the user may define. You should read the table as follows:
|YES||the special member function is defined by the compiler|
|NO||the special member function is not defined by the compiler|
|NO||the special member function is not defined by the compiler since it is defined by the user|
|YES||the special member function is defined by the compiler but this is deprecated and may be removed in the future|
|DELETED||the special member function is defined by the compiler as deleted|