inline
является избыточным, потому что: [dcl.constexpr] / 1 :
Функция или элемент данных stati c, объявленный с constexpr
или * Спецификатор 1008 * неявно является встроенной функцией или переменной ([dcl.inline]).
noexcept
несколько интереснее. Это правда, что попытка вызвать исключение (через throw
, dynamic_cast
или typeid
) не допускается в течение постоянного времени оценки ( [expr.const] /5.24). А поскольку функция consteval
оценивается только только в течение постоянного времени оценки, noexcept
имеет минимальное преимущество - исключение, безусловно, никогда не выйдет из этой области. И, кроме того, вы даже не можете иметь указатель на функцию, которая просачивается во время выполнения. На самом деле я не могу придумать механизма, для которого это было бы уместно.
Однако, возможно, в какой-то момент в будущем нам разрешат иметь исключения во время постоянной оценки? И если бы мы go там, стало ли важно знать о noexcept
-несстве в этом мире? Исключение, которое вытекает из контекста константной оценки, вероятно, должно означать ошибку компиляции, поэтому, возможно, у вас есть алгоритмы, которые делают разные варианты, основываясь на noexcept
-чности функции conteval?
Тем не менее, я бы пропустил noexcept
. Это, конечно, не приносит никакой пользы сейчас, и может даже не принести пользы в будущем. И если я в итоге ошибаюсь, тогда ... Извините.
Хотя на самом деле, как и Т. C. указывает, что это не так просто:
consteval int current() { return 1; }
void f(int, int = current()) noexcept;
Что такое noexcept(f(1))
? Как написано, это false
. И это довольно странно, так как выражение f(1)
определенно не выбрасывается. Поэтому, возможно, вам следует написать noexcept
. Хотя, с другой стороны, он определенно не может выдавать, возможно, по умолчанию язык должен делать consteval
функций noexcept
. Хотя, если мы сделаем это и в конце концов добавим исключения в течение постоянного времени оценки ... теперь мы снова вернемся к лжи, так как мы не сможем вернуться назад.