2014-12-01 14 views
11

Il C++ Programming Language quarta edizione - Bjarne Stroustrup: (sottolineatura mia)Un constexpr è più "costante" di const?

2.2.3. Costanti

In alcuni punti, espressioni costanti sono tenuti per regime linguistico (ad esempio, limiti di matrice (§2.2.5, §7.3), etichette di casi (§2.2.4, §9.4.2) , alcuni argomenti del modello (§25.2) e le costanti dichiarate usando constexpr). In altri casi, la valutazione in fase di compilazione è importante per le prestazioni. Indipendentemente dai problemi di prestazioni, la nozione di immutabilità (di un oggetto con uno stato non modificabile) è un'importante preoccupazione di progettazione (§10.4).

Sembra che Stroustrup suggerisce qui che constexpr assicura immutabilità di un oggetto meglio di un tradizionale dichiarazione const. È corretto? Ci sono modi in cui constexpr può essere più sicuro/meno volatile rispetto const, o fa Stroustrup semplicemente dire che dato che ci sono modi per utilizzare constexpr che non sono supportate con const (vedi Is constexpr really needed?), nei casi immutabilità può essere assicurata tramite constexpr?

+0

Correlato a ["Espressioni costanti" precedenti a C++ 11] (http: // stackoverflow.it/q/26024942/1708801) –

+1

Non riesco a trovare la mia copia del libro per verificare il contesto, ma poiché constexpr non garantisce l'immutabilità, sarei sorpreso se questo è ciò che sta suggerendo. Dalla tua breve citazione mi sembra che stia semplicemente dicendo che l'immutabilità è importante, non che è meglio per Constexpr che per averlo ottenuto rispetto a const, o viceversa. –

+0

@JonathanWakely - Forse hai ragione, è solo gettato lì perché il soggetto generale è ciò che chiama _immutabilità_. Sto mettendo l'intero paragrafo lassù ora - è una sintesi del materiale su 'constexpr', quindi ho capito che c'era qualcosa di speciale su' constexpr', come gli altri punti menzionati qui, ma forse no. – Vector

risposta

10

Egli afferma all'inizio della sezione:

C++ supporta due nozioni di immutabilità

e lui elenca const e constexpr, non credo che sta tentando per dire che constexpr assicura l'immutabilità migliore di const hanno solo caratteristiche diverse, anche se ammetto il fatto che il sen cita la sezione 10.4Le espressioni costanti sembrano implicare che, tale interpretazione sia incoerente con il resto del testo.

Una variabile che è const è immutabile in tale ambito, ma non può essere const nella portata maggiore (ad esempio un parametro di riferimento const a una funzione) e che è forse una distinzione sottile si sta tentando di realizzare, ha dice che const:

viene utilizzato principalmente per specificare interfacce

mentre constexpr:

Viene utilizzata per specificare costanti, per consentire il posizionamento dei dati in memoria di sola lettura

qualsiasi variabile constexpr dovrebbero essere valutati in fase di compilazione e quindi utilizzabili in cui le espressioni costanti sono necessari mentre una variabile passato come const a una funzione non deve essere const al di fuori di tale ambito.

Certo si può gettati via constness utilizzando const_cast ma il tentativo di modificare un oggetto const è un comportamento indefinito e quindi non è meno immutabile rispetto constexpr in questo senso, dalla sezione draft C++11 standard7.1.6.1il CV-qualificazioni:

qualsiasi tentativo di modificare un oggetto const durante la sua vita (3,8) si traduce in un comportamento indefinito

Jonathan Wakely nota che una variabile come const variabile può avere un mutable member ma che il membro non può essere utilizzato in un'espressione costante.

nota che una variabileconstexpr è anche const, dal progetto C++ 11 sezione standard 7.1.5L'identificatore constexpr:

Un identificatore constexpr utilizzato in una dichiarazione oggetto dichiara la oggetto come const.

+0

_Si dichiara chiaramente all'inizio della sezione .._ Sì, capito. Questo fa parte della domanda: come si modifica il valore di 'myConst' nella dichiarazione:' const int myConst = 999'? Il compilatore applica 'const'. Forse sovvertendolo con un puntatore? Sarebbe impossibile con 'constexpr'? C'è qualcosa di "più immutabile" su 'constexpr'. Non sono sicuro di aver capito questa risposta, tranne nel caso in cui la variabile sia passata come' const' in funzioni in modo che non possano essere modificate nella funzione. – Vector

+1

_ "un oggetto che è const è immutabile in quell'ambito ma potrebbe non essere const nello scope più grande" _ tecnicamente un oggetto è const o not, punto. Un oggetto non const può essere utilizzato attraverso un "percorso di accesso const" (ad esempio attraverso un puntatore const), ma l'oggetto stesso è ancora non const. E immutabile non significa solo "non cambia in questo momento, ma potrebbe cambiare in seguito". –

+0

@JonathanWakely questo è quello che ottengo per scrivere che prima di andare a dormire, risolto. –

5

const non garantire la costanza bit a bit, ad es. in quanto le classi possono avere membri mutabili (l'esempio tipico sarebbe un mutex privato per la sincronizzazione interna) e puoi const_cast allontanare la costanza da un puntatore.

constexpr dichiara una variabile costante o una funzione che può essere calcolata in fase di compilazione, il che implica alcune restrizioni su ciò che l'oggetto può essere, ma credo che la parola chiave stessa non fornisca garanzie aggiuntive durante l'esecuzione rispetto a const. Vedere anche la discussione this.

+0

Un oggetto dichiarato con constexpr può ancora avere membri mutabili, anche dopo la risoluzione del problema sollevato da Richard Smith ([DR 1405] (http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html# 1405)) semplicemente non può essere usato in un'espressione costante. Quindi hai ragione che significa che constexpr non garantisce ancora l'immutabilità. E puoi 'const_cast' via la costanza di qualcosa dichiarato' constexpr' (ma provare a modificarlo è ancora indefinito, proprio come una variabile dichiarata 'const') –

+0

Questo è quello che intendevo con" la stessa parola chiave non fornisce alcuna garantisce durante il runtime rispetto a const ". Vuoi dire, dovrei rimuovere il link ?. L'ho aggiunto, perché era la prima fonte che ho trovato, che affermava esplicitamente che gli oggetti 'constexpr' possono avere membri mutabili, supportando così il mio punto di" constexpr' non essere più costante di 'const'" – MikeMB

+0

Penso che sia utile keep it –

Problemi correlati