Contrassegnare una funzione come constexpr
lo rende anche una funzione in linea § [dcl.constexpr] / 1:
A function or static data member declared with the constexpr specifier is implicitly an inline function or variable (7.1.6).
inline
, a sua volta, significa che è necessario includere la definizione di tale funzione in ogni unità di traduzione in cui può essere utilizzata. Ciò significa fondamentalmente che le funzioni constexpr
devono essere:
- limitato all'uso in un'unità di traduzione o
- definito in un'intestazione.
Le funzioni più tipiche che vuoi dichiarare in un'intestazione e definirle in un file sorgente (e qualsiasi altra cosa che le usi include solo l'intestazione, quindi i collegamenti al file oggetto di quella sorgente) constexpr
semplicemente non funzionerà.
In teoria, suppongo che si possa semplicemente spostare tutto nelle intestazioni e avere un solo file sorgente che include solo tutte le intestazioni, ma ciò danneggerebbe drasticamente i tempi di compilazione e per i progetti più seri richiederebbe un'immensa quantità di memoria da compilare.
Anche una funzione constexpr
è limitata in alcuni modi, quindi per alcune funzioni potrebbe non essere affatto un'opzione. Le restrizioni includono:
- le funzioni virtuali non possono essere
constexpr
.
- il suo tipo di ritorno deve essere un "tipo letterale" (ad es., nessun oggetto con i sensori o i ditor non-trival).
- tutti i suoi parametri devono essere di tipo letterale.
- il corpo della funzione non può contenere un blocco
try
.
- non può contenere una definizione di variabile di tipo non letterale o qualsiasi cosa con durata di memorizzazione statica o di thread.
Ho saltato un paio di cose piuttosto oscure (ad esempio, non può contenere nemmeno un'istruzione goto
o asm
), ma hai un'idea: per un bel po 'di cose, ha appena vinto funziona.
In conclusione: sì, ci sono alcune situazioni in cui questa sarebbe una pessima idea.