Обозначение функции as constexpr
также делает ее встроенной функцией § [dcl.constexpr] / 1:
Функция или член статических данных, объявленные с помощью спецификатора constexpr, неявно являются встроенной функцией или переменной (7.1.6).
inline
в свою очередь означает, что вам нужно включить определение этой функции в каждую единицу перевода, в которой она может использоваться. Это в основном означает, что constexpr
функции должны быть либо:
- ограничено для использования в одной единице перевода, или
- определено в заголовке.
Большинство типичных функций, которые вы хотите объявить в заголовке и определить в исходном файле (и все, что использует их, включает в себя только заголовок, а затем ссылки на объектный файл этого источника) constexpr
просто не будет работать.
Теоретически, я полагаю, что вы можете просто переместить все в заголовки и иметь только один исходный файл, который просто включает все заголовки, но это сильно повредит времени компиляции, а для большинства серьезных проектов потребуются огромные объемы памяти для компиляции.
constexpr
Функция также ограничена в некотором роде, так что для некоторых функций , которые она не может быть вариантом вообще. Ограничения включают в себя:
- виртуальных функций быть не может
constexpr
.
- его возвращаемый тип должен быть «литеральным типом» (например, нет объектов с нетривальными ctors или dtors).
- все его параметры должны быть литеральными типами.
- тело функции не может содержать
try
блок.
- он не может содержать определение переменной не-литерального типа или что-либо со статической или продолжительностью хранения потока.
Я пропустил пару довольно непонятных вещей (например, они также не могут содержать goto
или asm
выражение), но вы поняли - для многих вещей это просто не сработает.
Итог: да, есть довольно много ситуаций, когда это было бы плохой идеей.