Conditions under which compiler will not define implicits (constructor, destructor, copy constructor, copy assignment)
c++, default-constructor, implicits
Solution
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;`
Problem
This is supposed to be a trivial question but I could not find it explicitly on stackoverflow. The following will be defined implicitly if not provided by the user. - default (parameterless) constructor - copy constructor - copy assignment operator - destructor But I have read somewhere (which I cant seem to find now), that there are some conditions where the compiler will not implicitly implement them. What are these conditions?