Можно объявить любую функцию, которая состоит только из оператора 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
просто потому, что вы не предусматриваете какое-либо использование во время компиляции:
потому что если другие эвтл. будут использовать ваш код, они могут увидеть такое использование, что
ты не. (Но, конечно, предоставляется для всех типов черт типа и прочего.)
Так что, я думаю, должна быть веская причина и хороший пример для преднамеренного
не объявлять функцию constexpr
?
(под «каждой функцией» я всегда подразумеваю: каждая функция, которая соответствует
требования для того, чтобы быть constexpr
, т. е. определяется как одиночный
оператор return, принимает только аргументы типов с constexpr
cstrs и вызывает только constexpr
функции.)
Вопрос Почему std :: forward
отбрасывает constexpr
-ness?
является частным случаем этого.