The Default Constuctor (e.g., X()
) will not be implicitly generated if:
- you have explicitly declared any constructor at all
- there is a data member that is not default-constructible (such as a reference, a
const
object, or a class with no or inaccessible default constructor)
- (C++11) you have explicitly told the compiler to not generate one using
X() = delete;
The Copy Constructor (e.g., X(const X&)
) will not be implicitly generated if:
- you have explicitly declared a copy constructor (for class
X
a constructor taking X
, X&
or const X&
)
- there is a data member that is not copy-constructible (such as a class with no or inaccessible copy constructor)
- the base class is not copy-constructible
- (C++11) you have declared a move constructor or move assignment operator
- (C++11) you have explicitly told the compiler to not generate one using
X(const X&) = delete;
The Copy Assignment Operator (e.g., X& operator=(const X&)
) will not be implicitly generated if:
- you have explicitly declared a copy assignment operator (for class
X
an operator=
taking X
, X&
or const X&
)
- there is a data member in your class that is not copy-assignable (such as a reference, a
const
object, or a class with no or inaccessible assignment operator)
- the base class is not copy-assignable
- (C++11) you have declared a move constructor or move assignment operator
- (C++11) you have explicitly told the compiler to not generate one using
X& operator=(const X&) = delete;
The Destructor (e.g., ~X()
) will not be implicitly generated if:
- you have explicitly declared a destructor
- (C++11) you have explicitly told the compiler to not generate one using
~X() = delete;
The Move Constructor (C++11) (e.g., X(X&&)
) will not be implicitly generated if:
- you have explicitly declared a move constructor (for class
X
, a constructor taking X&&
)
- you have declared a copy assignment operator, copy constructor, destructor, or move assignment operator
- there is a data member in your class that cannot be move-constructed (is
const
, is a reference, or has a deleted, inaccessible, or ambiguous move constructor)
- the base class cannot be move-constructed
- you have explicitly told the compiler to not generate one using
X(X&&) = delete;
The Move Assignment Operator (C++11) (e.g., X& operator=(X&&)
) will not be implicitly generated if:
- you have explicitly declared a move assignment operator (for class
X
, an operator=
taking X&&
)
- you have declared a copy assignment operator, copy constructor, destructor, or move constructor
- there is a data member in your class that cannot be move-assigned (is
const
, is a reference, or has a deleted, inaccessible, or ambiguous move assignment operator)
- the base class cannot be move-assigned
- you have explicitly told the compiler to not generate one using
X& operator=(X&&) = delete;