2014-06-10 18 views
8

Mi chiedevo se esistessero restrizioni su dove devono essere dichiarate le funzioni ei metodi di constexpr, come per le funzioni e i metodi in linea.Dichiarazione di funzioni o metodi di constexpr

So che le funzioni oi metodi inline devono essere scritti nei file di intestazione, per consentire al compilatore di accedere alla loro definizione in cui vengono chiamati. Avrebbe senso se ci fosse qualcosa di simile per constexpr, ma non riesce a trovare nulla su questo punto ...

Quindi, in pratica le mie domande sono:

  • Posso scrivere le definizioni di funzioni constexpr in un file di intestazione senza correre il rischio di avere un simbolo duplicato?

  • Posso separare la dichiarazione e la definizione delle funzioni o dei metodi di constexpr?

+0

Questo può essere correlato http: // StackOverflow.it/questions/4748083/when-should-you-use-constexpr-capability-in-c11 – alediaferia

+7

[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

+0

Correlati: http://stackoverflow.com/questions/14391272/does-constexpr-imply-inline – dyp

risposta

3

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.

Problemi correlati