Почему стандартные математические функции стандартной библиотеки "постоянные выражения"?
По какой-то причине clang++ (но не g++) жалуется на:
constexpr double invdecayf1m(double x) {
return -log1p(-x);
}
сообщив, что
non-constexpr function 'log1p' cannot be used in a constant expression
return -log1p(-x);
Почему нет общих математических функций, объявленных в <cmath>
, объявленных как "constexpr
functions" ?
Ответы
Ответ 1
Я думаю, что единственная причина - никто не написал предложение сделать их constexpr. В общем, это возможно, поскольку они являются чистыми функциями. Реализации могут использовать встроенные средства компилятора для их реализации для theier lib, поэтому никакой "реальной" реализации не требуется. Но без предложения вы не можете рассчитывать на constexpr
реализацию этих функций.
Ответ 2
Математическая библиотека, которая подразумевается в названии <cmath>
, исходит из c и была написана, когда constexpr
не была даже идеей.
Для того чтобы большинство функций были constexpr
, вам пришлось бы переписать всю библиотеку с помощью constexpr
.
Ответ 3
Ответ указан в указанной вами связи:
the function body must be either deleted or defaulted or contain only
the following:
....
точно один оператор return, содержащий только литералы, константы и функции constexpr.
Функции там не так просты. На самом деле они довольно сложны и не могут быть реализованы как единый оператор возврата. Тригонометрические, логарифмические и гиперболические функции довольно сложны и трудно реализуются как функции constexpr.