Contrassegnare una funzione in quanto la constexpr
rende anche una funzione incorporata § [dcl.constexpr] / 1:
Una funzione o un membro di dati statici dichiarato con l'identificatore constexpr è implicitamente una funzione o variabile inline (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 sostanzialmente che le constexpr
funzioni devono essere:
- limitato all'uso in un'unità di traduzione, o
- definito in un'intestazione.
Le funzioni più tipiche che si desidera dichiarare in un'intestazione e definite in un file sorgente (e qualsiasi altra cosa che le utilizza include solo l'intestazione, quindi i collegamenti al file oggetto di quella fonte) constexpr
semplicemente non funzionerà.
In teoria, suppongo che potresti semplicemente spostare tutto nelle intestazioni e avere un solo file sorgente che includa solo tutte le intestazioni, ma ciò danneggerebbe drasticamente i tempi di compilazione e per la maggior parte dei progetti seri richiederebbe enormi quantità di memoria da compilare.
Una constexpr
funzione è anche 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 esempio, nessun oggetto con inseguitori o trici non trivalenti).
- tutti i suoi parametri devono essere di tipo letterale.
- il corpo della funzione non può contenere un
try
blocco.
- non può contenere una definizione variabile di tipo non letterale o qualsiasi cosa con durata di archiviazione statica o thread.
Ho saltato un paio di cose piuttosto oscure (ad esempio, non può contenere nemmeno una goto
o una asm
dichiarazione), ma ottieni l'idea - per un bel po 'di cose, semplicemente non funzionerà.
In conclusione: sì, ci sono alcune situazioni in cui questa sarebbe una cattiva idea.