1 Определение функции вида:
attribute-specifier-seq opt decl-specifier-seq opt declarator virt-specifier-seq opt = default ;
называется явно дефолтным определением. Функция, которая явно установлена по умолчанию, должна
(1.1) - быть специальной функцией-членом,
(1.2) - иметь один и тот же объявленный тип функции (за исключением, возможно, различных ref-квалификаторов и за исключением того, что в
В случае конструктора копирования или оператора назначения копирования тип параметра может быть «ссылкой на
неконстантный T », где T - имя класса функции-члена), как если бы он был неявно объявлен,
и
(1.3) - не имеет аргументов по умолчанию.
2 Явно дефолтная функция, которая не определена как удаленная, может быть объявлена constexpr, только если она будет
были неявно объявлены как constexpr. Если функция явно установлена по умолчанию в своем первом объявлении, она
неявно считается constexpr, если неявное объявление будет.
3 Если функция с явным значением по умолчанию объявлена с указателем noexcept, который не выдает то же самое
спецификация исключения как неявное объявление (18.4), тогда
(3.1) - если функция явно установлена по умолчанию в своем первом объявлении, она определяется как удаленная;
(3.2) - в противном случае программа некорректна.
4
[Пример:
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; // OK: private copy constructor
S(S&);
};
S::S(S&) = default; // OK: defines copy constructor
- конец примера]
5 Явно-дефолтные функции и неявно объявленные функции вместе называются дефолтными функциями, и
реализация должна предоставить для них неявные определения (15.1, 15.4, 15.8), что может означать определение
они как удалены. Функция предоставляется пользователем, если она объявлена пользователем и не имеет явных значений по умолчанию или удалена
на своей первой декларации. Предоставленная пользователем явно дефолтная функция (т.е. явно дефолтная после ее первого
декларация) определяется в том месте, где оно явно не выполнено; если такая функция неявно определяется как
удален, программа некорректна [Примечание: объявление функции по умолчанию после ее первого объявления может
обеспечить эффективное выполнение и четкое определение, обеспечивая в то же время стабильный двоичный интерфейс для развивающегося кода
база. - конец примечания]
6 [Пример:
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
- конец примера]
Тогда, конечно, вопрос в том, какие функции могут быть неявно объявлены и когда это происходит, что я объяснил на: