Il posto definito da una funzione constexpr
influisce sul modo in cui è possibile utilizzarlo. In particolare:
C++ 14 [expr.const] p2:
A condizionale espressione e
è un nucleo costante espressione meno che la valutazione di e
, seguendo le regole della macchina astratta (1.9) , sarebbe di valutare una delle seguenti espressioni:
- ...
- un'invocazione di un
constexpr
funzione non definita o un constexpr
costruttore non definito;
quindi non è possibile utilizzare una funzione constexpr
in un'espressione costante (argomento di un template, constexpr
variabile inizializzazione, inizializzazione variabile globale che deve essere valutata in modo statico, un array legato espressione, forse altri) se è stato solo dichiarato ma non ancora definito.
Allo stesso modo, come ha commentato dyp,
C++ 14 [dcl.constexpr] p2
... constexpr
funzioni e constexpr
costruttori sono implicitamente inline
(7.1.2).
Ciò implica la risposta alla prima domanda: la definizione della funzione constexpr
in un'intestazione non causa simboli duplicati. Significa anche che se dichiari una funzione di constexpr in un'intestazione e poi la chiami in un'unità di traduzione, anche solo in fase di esecuzione, "Una funzione inline deve essere definita in ogni unità di traduzione in cui è odr-used." da C++ 14 [basic.def.odr] p4.
Nota che le regole per espressioni costanti e chiamate in generale sono diversi: le chiamate in genere richiedono la definizione di essere da qualche parte nella unità di traduzione: espressioni costanti richiedono la definizione di essere prima l'espressione costante.
fonte
2014-06-23 08:34:35
Questo può essere correlato http: // StackOverflow.it/questions/4748083/when-should-you-use-constexpr-capability-in-c11 – alediaferia
[dcl.constexpr]/2 "' funzioni constexpr' e 'constexpr' sono implicitamente' inline' "Che quindi implica che tu * necessita * di una definizione in ogni unità di traduzione (file sorgente) in cui viene utilizzata la funzione, e puoi avere più definizioni in diversi file sorgente a condizione che siano equivalenti (vedi ODR). – dyp
Correlati: http://stackoverflow.com/questions/14391272/does-constexpr-imply-inline – dyp