Почему стандартные математические функции стандартной библиотеки "постоянные выражения"?

По какой-то причине 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.