Являются ли `inline` и` noexcept` избыточными в контексте контраста? - PullRequest
6 голосов
/ 27 февраля 2020

Я работаю с некоторым кодом, в котором используются constexpr функции, которые я в настоящее время рефакторинг, чтобы по возможности consteval.

inline constexpr auto example() noexcept { /*...*/ }

Как я понимаю , Ключевое слово inline выше уже избыточно в функции constexpr.

Насколько я понимаю, ключевые слова noexcept являются избыточными для функций consteval, потому что, насколько я понимаю, consteval имеет быть оцененным во время компиляции, и, следовательно, подразумевает noexcept. Это правда или может быть что-то, что я сейчас не рассматриваю (например, constexpr exceptions)?

consteval auto example() { /*...*/ }

1 Ответ

7 голосов
/ 27 февраля 2020

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. Хотя, если мы сделаем это и в конце концов добавим исключения в течение постоянного времени оценки ... теперь мы снова вернемся к лжи, так как мы не сможем вернуться назад.

...