Come ha notato Barry in his answer, la vecchia sintassi C (e l'estensione C++ di tale sintassi) non supporta la visualizzazione concettuale della sostituzione del testo, come in matematica.
Utilizzando la sintassi C direttamente è quindi generalmente una buona idea per scrivere T const
, non const T
, anche se, quando T
è un tipo semplice queste espressioni tipo sono equivalenti. La scrittura T const
evita inoltre incoerenze in una dichiarazione di puntatore multilivello come char const* const p;
, in cui non è possibile spostare l'ultimo const
. Che esemplifica che l'equivalenza è solo per il tipo di base all'inizio di una dichiarazione.
Alcuni mesi fa ho iniziato un esperimento scrivendo const T
e utilizzando tale notazione in modo coerente. Perché ora è possibile dopo C++ 11, senza usare macro. Per sostenere la consistenza che uso chiamato tipo costruttori come
template< class Some_type >
using Ptr_ = Some_type*;
in modo che al posto della lettura da destra a sinistra
char const* const p = something;
posso e non scrivere la direzione di lettura ordinaria
const Ptr_<const char> p = something;
E 'po' più prolisso, ma ora, con una certa esperienza di usarlo, credo che sia valsa la pena (non ero sicuro di questo, è stato un experime nt).
Lo svantaggio principale è che mentre questa notazione supporta la deduzione dei tipi per argomenti della funzione (modello di funzione) proprio come l'uso diretto della sintassi C, non supporta la deduzione di tipo per le dichiarazioni auto
. Fortunatamente, poiché un inizializzatore può essere facilmente realizzato const
, l'unico caso problematico riguarda l'array.La mia soluzione pragmatica finora è stata quella di usare la sintassi C (o meglio, C++) direttamente in questi casi, ma penso che ciò rappresenti una lacuna o un buco nel linguaggio, possibilmente con qualche soluzione generale che renderebbe le cose molto più facili anche in altri contesti.
Per i miei builder di tipo corrente come Ptr_
, vedere the cppx/core_language_support/type_builders.hpp file at Github. Includono per es. In_
per gli argomenti della funzione. E sì, ho trovato che ne vale anche la pena, per chiarezza, nonostante qualche verbosità, perché rende l'intento molto chiaro. Tuttavia, le informazioni su cppx sono sperimentali e soggette a modifiche. Il file specifico collegato a qui può anche essere spostato, ma sarà a distanza. :)
Non c'è differenza, semanticamente. Solo una domanda su quale stile preferisce. –
Nel primo 's' è un riferimento a una stringa costante. Nel secondo 's' c'è un riferimento a una stringa che è costante. Cioè entrambi sono davvero gli stessi. –
Argomenti correlati: http://stackoverflow.com/questions/5503352/const-before-or-const-after http://stackoverflow.com/questions/1143262/what-is-the-difference-between-const-int -const-int-const-and-int-const – dragosht