Marquer une fonction comme en constexpr
fait également une fonction en ligne § [dcl.constexpr] / 1:
Une fonction ou un membre de données statiques déclaré avec le spécificateur constexpr est implicitement une fonction ou une variable en ligne (7.1.6).
inline
, à son tour, signifie que vous devez inclure la définition de cette fonction dans chaque unité de traduction dans laquelle elle peut être utilisée. Cela signifie essentiellement que les constexpr
fonctions doivent être soit:
- limité à une utilisation dans une unité de traduction, ou
- défini dans un en-tête.
La plupart des fonctions typiques que vous souhaitez déclarer dans un en-tête et définir dans un fichier source (et tout autre élément qui les utilise inclut simplement l'en-tête, puis les liens avec le fichier objet de cette source) constexpr
ne fonctionneront tout simplement pas.
En théorie, je suppose que vous pouvez simplement tout déplacer dans les en-têtes et n'avoir qu'un seul fichier source qui inclut uniquement tous les en-têtes, mais cela nuirait considérablement aux temps de compilation, et pour la plupart des projets sérieux, il faudrait d'immenses quantités de mémoire pour compiler.
Une constexpr
fonction est également limitée à certains égards, donc pour certaines fonctions, il peut ne pas être une option du tout. Les restrictions comprennent:
- les fonctions virtuelles ne peuvent pas l' être
constexpr
.
- son type de retour doit être un "type littéral" (par exemple, aucun objet avec des ctors ou des dtors non-trivalents).
- tous ses paramètres doivent être des types littéraux.
- le corps de la fonction ne peut pas contenir de
try
bloc.
- il ne peut pas contenir de définition de variable d'un type non littéral, ou quoi que ce soit avec une durée de stockage statique ou de thread.
J'ai sauté quelques choses plutôt obscures (par exemple, il ne peut pas non plus contenir de goto
ou une asm
déclaration), mais vous avez l'idée - pour pas mal de choses, cela ne fonctionnera tout simplement pas.
Conclusion: oui, il y a pas mal de situations où ce serait une mauvaise idée.