The term "user-declared" does not have a formal definition in the standard. It must be the opposite of “implicitly declared” in the context of special member functions. [dcl.fct.def.default] / 4 may be a little clearer about this fact, but there is an intention:
Explicit default functions and implicitly declared functions are collectively called default functions, and the implementation must contain implicit definitions for them (12.1, 12.4, 12.8), which may mean their removal. A special member function is provided to the user if it is declared by the user and is clearly not defaulted or deleted by its first declaration. The user-provided function of explicitly default value (i.e., explicitly defaulted after the first declaration) is defined in the place where it is clearly defaulted; if such a function is implicitly defined as remote, the program is poorly formed.
Both NoCopy(NoCopy&) = delete; and NoCopy& operator=(const NoCopy&) = delete; are declarations of special member functions. Because you explicitly declare them, rather than letting the compiler declare them implicitly, they are declared by the user. Thus, these declarations will suppress the implicit declarations of the move constructor and the redirection assignment operator on [class.copy] / 9:
If the definition of class X does not explicitly declare the move constructor, it will be declared as implicit as default, if and only if
- X does not have a copy constructor declared by the user,
- X does not have a user-declared copy destination operator,
- X does not have a user-defined move destination operator,
- X does not have a user-declared destructor and
- the move constructor will not be explicitly defined as remote.
Casey source share