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