Любая функция, состоящая только из оператора return, может быть объявлена
constexpr
и, таким образом, позволит оцениваться во время компиляции, если все
аргументы constexpr
, и только функции constexpr
вызывают в своем
тело. Есть ли причина, почему бы не объявить такую функцию constexpr
?
Пример:
constexpr int sum(int x, int y) { return x + y; }
constexpr i = 10;
static_assert(sum(i, 13) == 23, "sum correct");
Может ли кто-нибудь предоставить пример, в котором объявление функции constexpr
причинил бы какой-либо вред?
Некоторые исходные мысли:
Даже если не должно быть веских оснований для объявления функции
not constexpr
Я мог предположить, что ключевое слово constexpr
имеет
переходная роль: его отсутствие в коде, которому не требуется время компиляции
оценки позволят компиляторам, которые не реализуют время компиляции
оценки еще предстоит скомпилировать этот код (но с надежным отказом от кода
которые нуждаются в них, как это сделано, используя constexpr
).
Но я не понимаю: если не должно быть веских оснований для
когда-либо объявляя функцию не constexpr
, почему не каждая функция
в стандартной библиотеке объявлено constexpr
? (Вы не можете спорить
что это еще не сделано, потому что еще не было достаточного времени для
сделайте это, потому что делать это для всех - это не проблема - вопреки решению
для каждой отдельной функции, если сделать ее constexpr
или нет).
--- Я знаю, что N2976
намеренно не требует cstrs для многих стандартных типов библиотек, таких как
как контейнеры, поскольку это было бы слишком ограничивающим возможным
Реализации. Давайте исключаем их из аргумента и просто задаемся вопросом:
как только тип стандартной библиотеки имеет constexpr
cstr, почему
каждая работающая на нем функция объявила constexpr
?
В большинстве случаев вы также не можете утверждать, что вы можете не объявлять функцию
constexpr
просто потому, что вы не планируете использовать время компиляции:
потому что если другие evtl. будут использовать ваш код, они могут увидеть такое использование, которое
ты не. (Но предоставляется, конечно, для типов типов типов и т.д.)
Итак, я думаю, что должна быть веская причина и хороший пример для намеренного
не объявляя функцию constexpr
?
(с "каждой функцией" я всегда имею в виду: каждая функция, соответствующая
требования для constexpr
, то есть определяются как одиночные
return, принимает только аргументы типов с constexpr
cstrs и вызывает только функции constexpr
.)
Вопрос Почему std::forward
отбрасывает constexpr
-ness?
является частным случаем этого.