Conditions for automatic generation of default/copy/move ctor and copy/move assignment operator?

后端 未结 3 1070
旧巷少年郎
旧巷少年郎 2020-11-22 03:57

I want to refresh my memory on the conditions under which a compiler typically auto generates a default constructor, copy constructor and assignment operator.

I reco

3条回答
  •  感动是毒
    2020-11-22 04:33

    C++17 N4659 standard draft

    For a quick cross standard reference, have a look at the "Implicitly-declared" sections of the following cppreference entries:

    • https://en.cppreference.com/w/cpp/language/copy_constructor
    • https://en.cppreference.com/w/cpp/language/move_constructor
    • https://en.cppreference.com/w/cpp/language/copy_assignment
    • https://en.cppreference.com/w/cpp/language/move_assignment

    The same information can of course be obtained from the standard. E.g. on C++17 N4659 standard draft:

    15.8.1 "Copy/move constructors" says for for copy constructor:

    6 If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (11.4). The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor.

    and for move constructor:

    8 If the definition of a class X does not explicitly declare a move constructor, a non-explicit one will be implicitly declared as defaulted if and only if

    • (8.1) — X does not have a user-declared copy constructor,

    • (8.2) — X does not have a user-declared copy assignment operator,

    • (8.3) — X does not have a user-declared move assignment operator, and

    • (8.4) — X does not have a user-declared destructor.

    15.8.2 "Copy/move assignment operator" says for copy assignment:

    2 If the class definition does not explicitly declare a copy assignment operator, one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy assignment operator is defined as deleted; otherwise, it is defined as defaulted (11.4). The latter case is deprecated if the class has a user-declared copy constructor or a user-declared destructor.

    and for move assignment:

    4 If the definition of a class X does not explicitly declare a move assignment operator, one will be implicitly declared as defaulted if and only if

    • (4.1) — X does not have a user-declared copy constructor,
    • (4.2) — X does not have a user-declared move constructor,
    • (4.3) — X does not have a user-declared copy assignment operator, and
    • (4.4) — X does not have a user-declared destructor.

    15.4 "Destructors" says it for destructors:

    4 If a class has no user-declared destructor, a destructor is implicitly declared as defaulted (11.4). An implicitly-declared destructor is an inline public member of its class.

提交回复
热议问题