Can non-special C++ member functions be deleted (or defaulted)?
c++, c++11
Solution
Any function whatsoever can be declared as deleted (using `= delete`). The standard does not impose any restrictions. This is covered by C++11[dcl.fct.def.delete]. It even gives an example of a deleted `operator new`.
Defaulted functions, on the other hand, are limited by [dcl.fct.def.default]§1 as follows:
1 ... A function that is explicitly defaulted shall
- be a special member function,
- have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const `T`”, where `T` is the name of the member function’s class) as if it had been implicitly declared, and
- not have default arguments.
The "special member functions" referenced in the first bullet point are (as per [special]§1):
- default constructor
- copy constructor
- move constructor
- copy assignment operator
- move assignment operator
- destructor
Problem
A lot of attention has been received by `= default` and `= delete` with respect to the special members (default constructor, destructor, copy and move). Can `= default` and `= delete` be used with other functions; member functions, free functions and operators etc.? I can understand that `= default` would probably not be allowed outside the special members; since it is basically saying use the compiler generated default. The default would need to be clearly defined before the compiler is able to generate it. As far as I know, only the special members have these pre-defined defaults. What about `= delete`; it is basically saying that the function is declared, but the implementation is explicitly not defined. - Can `= delete` be used with functions other than the special members? - What function types can it be used on (members, non-members, operators etc.)? - Or conversely, where (or when) is `= delete` prohibited from being used? Are there any restrictions on its use?