2016-02-24 12 views
8

Sono totalmente frustrato con questi specificatori perché capisco cosa fanno quando sono da soli ma li trovo difficili da capire quando sono usati l'uno con l'altro. Ad esempio, un po 'di codice in natura conteneva -statico, constexpr, const - cosa significano quando tutti usati insieme?

namespace{ 
static constexpr char const *Hello[] = { "HelloString", "WorldString"}; 
... 
} 

cosa fa anche questo?

  • perché utilizzare statico quando si è già all'interno di uno spazio dei nomi anonimo. E le statiche all'interno delle classi hanno senso (a meno che tu non stia scrivendo C che manca di spazi dei nomi), senza classi - perché ??
  • perché usare constexpr - non c'è motivo di usarlo qui. non sarebbe un semplice const?
  • e quindi const *Hello non ha senso per me. Cosa è costante qui? Le stringhe o il puntatore *Hello?

E peggio di tutto, compila: /. Ovviamente si compilerebbe perché sono dichiarazioni valide, ma cosa significa?

+0

constexpr suggerisce di utilizzare C++ 11. Conoscere questa statica ha senso di nuovo perché renderà sicuro il thread di inizializzazione. (statica magica). E constexpr lo rende utilizzabile in luoghi in cui non funzionerebbe con const. – Totonga

+0

Non penso di inizializzare uno scalare con una compilazione di liste iniziali rinforzate. –

+2

Perché la statica magica e la sicurezza dei thread sono importanti per l'inizializzazione del caricamento? Che tipo di esecuzione parallela potrebbe accadere lì? – IanH

risposta

6

Perché utilizzare statico quando si è già all'interno di uno spazio dei nomi anonimo?

Non vedo un motivo per qui, a meno che non sia stato scritto per la compatibilità con C++ 03.

Perché utilizzare constexpr - non c'è motivo di usarlo qui. non farebbe una semplice const?

Ancora, non è necessario qui, ma indica che è una costante di tempo di compilazione. Si noti inoltre che constexpr indica che il puntatore è constexpr e rimuove la necessità di const dopo lo * (vedere la parte successiva).

const *Hello non ha senso per me. Cosa è costante qui? Le stringhe o il puntatore * Ciao?

const si applica a sinistra, a meno che non vi sia nulla nel qual caso si applica a destra. const a sinistra di * significa che il puntatore quando dereferenziato è una costante, mentre a destra significa che è un puntatore costante a qualcosa.

char const * ptr = "Foo"; 
ptr[0] = 'B'; //error, ptr[0] is const 

char * const ptr = "Foo"; 
ptr = new char[10]; //error, ptr is const 

char const * const ptr = "Foo"; //cannot assign to either ptr or *ptr 
constexpr char const* ptr = "Foo"; //same as above, constexpr replaced last const 

ho scoperto che this pagina sulla regola "destra a sinistra" aiuta veramente con le dichiarazioni comprensione complicata.