Я не хотел сказать, что это ваша вина :) Но, может быть, вы помните этот код и могли бы воспроизвести его здесь?

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

Ответы на вопрос(3)

Ваш ответ на вопрос