11 Declarators [dcl.decl]

11.4 Function definitions [dcl.fct.def]

11.4.2 Explicitly-defaulted functions [dcl.fct.def.default]

Определение функции в форме:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt  = default ;

называется explicitly-defaulted определением. Функция, которая явно задана по умолчанию, должна

  • быть специальной функцией-членом,

  • иметь один и тот же объявленный тип функции (за исключением возможных различий ref-qualifiers и за исключением того, что в случае конструктора копирования или оператора присваивания копии тип параметра может быть «ссылкой на неконстантный T», где T является именем класса функции-члена) как если это было неявно объявлено, и

  • не иметь аргументов по умолчанию.

Явно заданная по умолчанию функция, которая не определена как удаленная, может быть объявлена constexpr только в том случае, если она была неявно объявлена ​​как constexpr. Если функция явно задана по умолчанию при ее первом объявлении, она неявно считается constexpr таковой, если неявное объявление будет.

Если функция, для которой явно задано значение по умолчанию, объявляется с помощью noexcept-specifier, который не создает такую ​​же спецификацию исключения, как неявное объявление ([except.spec]), тогда

  • если функция явно задана по умолчанию при ее первом объявлении, она определяется как удаленная;

  • в противном случае программа имеет неправильный формат.

[Example:

struct S {
  constexpr S() = default;              // ill-formed: implicit S() is not constexpr
  S(int a = 0) = default;               // ill-formed: default argument
  void operator=(const S&) = default;   // ill-formed: non-matching return type
  ~S() noexcept(false) = default;       // deleted: exception specification does not match
private:
  int i;
  S(S&);                                // OK: private copy constructor
};
S::S(S&) = default;                     // OK: defines copy constructor

end example]

Явно заданные по умолчанию функции и неявно объявленные функции совместно называются defaulted функциями, и реализация должна предоставлять для них неявные определения ([class.ctor] [class.dtor], [class.copy]), что может означать определение их как удаленных. Функция - user-provided это если она объявлена ​​пользователем и не была явно задана по умолчанию или удалена при ее первом объявлении. Предоставляемая пользователем функция с явно заданным по умолчанию значением (т. Е. Явно заданная по умолчанию после ее первого объявления) определяется в точке, где она явно задана по умолчанию; если такая функция неявно определена как удаленная, программа имеет неправильный формат. [ Note: Объявление функции по умолчанию после ее первого объявления может обеспечить эффективное выполнение и краткое определение, в то же время обеспечивая стабильный двоичный интерфейс для развивающейся базы кода. ]end note

[Example:

struct trivial {
  trivial() = default;
  trivial(const trivial&) = default;
  trivial(trivial&&) = default;
  trivial& operator=(const trivial&) = default;
  trivial& operator=(trivial&&) = default;
  ~trivial() = default;
};

struct nontrivial1 {
  nontrivial1();
};
nontrivial1::nontrivial1() = default;   // not first declaration

end example]