Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
378 views
in Technique[技术] by (71.8m points)

c++11 - Can non-special C++ member functions be deleted (or defaulted)?

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?
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...