Marcar una función constexpr
también la convierte en una función en línea § [dcl.constexpr] / 1:
Una función o miembro de datos estáticos declarado con el especificador constexpr es implícitamente una función o variable en línea (7.1.6).
inline
, a su vez, significa que debe incluir la definición de esa función en cada unidad de traducción en la que se pueda utilizar. Eso básicamente significa que las constexpr
funciones tienen que ser:
- restringido para uso en una unidad de traducción, o
- definido en un encabezado.
La mayoría de las funciones típicas que desea declarar en un encabezado y definir en un archivo fuente (y cualquier otra cosa que las use solo incluye el encabezado, luego los enlaces contra el archivo objeto de esa fuente) constexpr
simplemente no funcionarán.
En teoría, supongo que podría mover todo a los encabezados y tener solo un archivo fuente que solo incluya todos los encabezados, pero esto dañaría drásticamente los tiempos de compilación, y para la mayoría de los proyectos serios requeriría una inmensa cantidad de memoria para compilar.
Una constexpr
función también está restringida de alguna manera, por lo que para algunas funciones puede no ser una opción en absoluto. Las restricciones incluyen:
- las funciones virtuales no pueden ser
constexpr
.
- su tipo de retorno debe ser un 'tipo literal "(p. ej., no objetos con ctors o dtors no trival).
- Todos sus parámetros deben ser de tipo literal.
- El cuerpo de la función no puede contener un
try
bloque.
- no puede contener una definición variable de un tipo no literal, ni nada con duración de almacenamiento estático o de subprocesos.
Me he saltado un par de cosas bastante oscuras (por ejemplo, tampoco puede contener una goto
o una asm
declaración), pero entiendes la idea: para bastantes cosas, simplemente no funcionará.
En pocas palabras: sí, hay bastantes situaciones en las que esta sería una mala idea.