N. I.:
NI>Если определение функции доступно в каждой единице трансляции, где её вызывают (что типично для шаблонных и inline функций), то ничто не мешает компилятору попробовать вычислить её на этапе компиляции независимо от того, есть у неё спецификатор constexpr или нет. Наличие у функции спецификатора constexpr может лишь дать оптимизатору подсказку, что вероятность существования возможности посчитать её в compile time выше, чем в случае с "обычными" функциями, при этом в общем случае constexpr не даёт гарантий, что функцию можно посчитать в compile time при вызове её с любыми аргументами, значения которых известны на этапе компиляции.
Тут может быть скрываться проблема совместимости. Компилятор A даёт послабления и съест исходник, а компилятор B выплюнет. Или даже две версии одного компилятора.
Программист, понадеявшийся на нестандартную фичу создаст крайне непортабельный код, который фиг откомпилируешь.
Конкретный пример, один компилятор проверяет все ветки на соответствие constexpr-у, а другой только те что вычисляются.
На хабре был пример
https://habrahabr.ru/post/228181/ , бросать исключение в дохлых ветках констекспра формальное не запрещалось. Такой финт ушами использовался для совместимости compile-time и run-time по ошибкам.
Оказалось не все компиляторв такое могут.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.