В cppreference объявление функции в разделе Пользовательские функции. Есть фраза:
Объявление функции по умолчанию после ее первого объявления может обеспечить эффективное выполнение и краткое определение, обеспечивая при этом стабильный двоичный интерфейс для развивающейся базы кода.
Главный вопрос: =default
и =delete
— это объявление функции или определение функции?
Разве это не должно быть
Определить функцию по умолчанию после ее первого объявления?
В том же смысле мы также можем утверждать, что термин declaring as defaulted
должен быть преобразован в defining as defaulted
, потому что, когда мы объявляем функцию по умолчанию, это фактически генерирует определение функции.
Так вот
struct triv
{
triv() = default;
};
Мы одновременно объявляем его конструктором по умолчанию и в дальнейшем определяем его. Я думаю, что это называется declaring as defaulted
, потому что синтаксис больше похож на объявление функции, чем на определение функции.
Также в стандарте C++11
, в 8.4.2.4
. Отмечается, что
Предоставленная пользователем функция с явным значением по умолчанию (т. е. явно установленная по умолчанию после ее первое объявление) определяется в точке, где оно явно задано по умолчанию.
Поэтому я считаю излишним искать разницу в терминах defaulting a function
, declaring as defaulted
и defining as defaulted
.
Это определения. Но, как и большинство (все?) определений, они также являются объявлениями.
Удаленное определение функции — это определение функции, чье...
Определение функции, тело функции которого имеет вид
=
default
;
, называется определением с явным значением по умолчанию...
Главный вопрос:
=default
и=delete
— это объявление функции или определение функции?
Согласно [dcl.fct.def.delete]/1 и [dcl.fct.def.default]/1 это определения. Однако определения также являются объявлениями, хотя не все объявления являются определениями.
Разве это не должно быть
Определить функцию по умолчанию после ее первого объявления?
Как указано выше, и «объявление», и «определение» формально правильны, но действительно, использование «определения», возможно, может быть более неформально точным.
Наконец, обратите внимание, что существует ключевое различие между явно удаленными и явно заданными по умолчанию функциями в контексте этого вопроса: удаленная функция должна быть первым объявлением функции (за исключением удаления явных специализаций шаблонов функций — удаление должно быть при первом объявлении функции). специализация), что означает, что вы не можете объявить функцию, а затем удалить ее, скажем, при ее определении, локальном для единицы перевода; согласно [dcl.fct.def.delete]/4:
Удаленная функция неявно является встроенной функцией ([dcl.inline]).
[Примечание 2: Правило одного определения ([basic.def.odr]) применяется к удаленным определения. — примечание в конце]
Удаленное определение функции должно быть первым объявлением функция или, для явной специализации функции шаблон, первое объявление этой специализации. неявно объявленная функция выделения или освобождения ([basic.stc.dynamic]) не определяется как удаленный.
[Пример 4:
struct sometype { sometype(); }; sometype::sometype() = delete; // error: not first declaration
— конец примера]
Не уверен, но я полагаю, что они имеют в виду отдельное объявление, а затем определение по умолчанию, как в следующем примере: пример на coliru - О. Пример очень похож на
struct nontrivial
на связанной странице... :-)