Ответ 1
2 Явно-дефолтная функция, которая не определена как удаленная, может быть объявлена
constexpr
только в том случае, если она была бы неявно объявлена какconstexpr
. Если в первом объявлении функция явно дефолтована,
- он неявно считается
constexpr
если подразумевается декларация, и,- он имеет такую же спецификацию исключения, как если бы он был неявно объявлен ([except.spec]).
3 Если функция, явно заданная по умолчанию, объявляется с несобственной спецификацией исключения ([except.spec]) с спецификацией исключения неявного объявления, тогда
если функция явно дефолтована по первому объявлению, она определяется как удаленная;
в противном случае программа плохо сформирована.
Другими словами, foo() = default;
, который обязательно является первым объявлением конструктора по умолчанию foo
, будет " constexpr
по возможности" и " noexcept
если это возможно". Явное написание constexpr
и noexcept
еще полезна; это означает "кричать на меня, если это не может быть constexpr
/noexcept
".