Почему ** не ** объявить функцию как constexpr?

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

58
задан einpoklum - reinstate Monica 18 July 2018 в 07:37
поделиться