Ответ 1
Функция A (non-template) constexpr
должна иметь как минимум один путь выполнения, который возвращает константное выражение; формально должны существовать значения аргументов, так что "вызов функции [...] может быть оцененным подвыражением основного константного выражения" ( [dcl.constexpr]/5). Например (там же):
constexpr int f(bool b) { return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
Здесь int f(bool)
разрешено быть constexpr
, потому что его вызов с аргументом value false
возвращает константное выражение.
Возможно, существует функция constexpr
, которая никогда не может возвращать константное выражение, если оно является специализацией шаблона функции, который может иметь хотя бы одну специализацию, которая возвращает константное выражение. Опять же, с приведенным выше:
template<bool B> constexpr int g() { return f(B); } // OK
constexpr int h() { return g<true>(); } // ill-formed, no diagnostic required