2013-12-18 12 views
7

Ho il seguente codice:Const prima o dopo il tipo?

string const& operator[] (size_t index) const { return elems[index]; } 

non dovrebbe essere:

const string& 

?

+5

Qui non fa differenza. – Rapptz

+0

Nella sua forma più pura, dovrebbe venire dopo aver mantenuto le cose coerenti. Il fatto che possa andare a sinistra è l'eccezione, davvero. Detto questo, personalmente preferisco la sinistra. – chris

+0

Penso che sia più facile leggere i nomi dei tipi se li metti a destra, ma non fa differenza. – Simple

risposta

16

Le qualifiche Cv come const si applicano a qualsiasi cosa si trovi a sinistra, a meno che non vi sia nulla, nel qual caso si applicano a destra. Per string const&, lo const si applica allo string alla sua sinistra. Per const string&, lo const si applica allo string alla sua destra. Cioè, sono entrambi riferimenti a conststring, quindi in questo caso, non fa differenza.

Alcune persone preferiscono averlo a sinistra (come const int) perché legge da sinistra a destra. Alcune persone preferiscono averlo a destra (come int const) per evitare di utilizzare il caso speciale (int const * const è più coerente di const int* const, ad esempio).

+0

Cosa sono 'const int * const' e' int const * const' ....? – Sangram

+0

@ user2745266 Sono entrambi puntatori 'const' su' const' 'int'. –

+0

Grazie per la risposta. Quello che volevo chiedere era come entrambi i 'const' siano applicati in questi due casi (quale è per int e quale per puntatore). Potrebbe essere avrei dovuto chiedere in modo corretto. Grazie. – Sangram

3

Funziona in entrambi i casi in questo contesto ed è una questione di preferenze personali e convenzioni di codifica.

Alcuni programmatori preferiscono metterlo dopo il il nome del tipo in modo che sia più coerente con altri usi di const. Ad esempio, se si sta dichiarando un puntatore dove il puntatore stesso (piuttosto che la punta-al tipo) è quello di essere const, è necessario mettere dopo l'asterisco:

string * const ptr; 

Allo stesso modo, se siete dichiarando una funzione membro const, deve andare dopo la dichiarazione della funzione; es:

class Foo 
{ 
    void func() const; 
}; 
5

Il const può essere su entrambi i lati del tipo di dati così:

const int *” è uguale a “int const *

const int * const” è uguale a “int const * const

int *ptr;   // ptr is pointer to int 
int const *ptr;  // ptr is pointer to const int 
int * const ptr;  // ptr is const pointer to int 
int const * const ptr; // ptr is const pointer to const int 
int ** const ptr;  // ptr is const pointer to a pointer to an int 
int * const *ptr;  // ptr is pointer to a const pointer to an int 
int const **ptr;  // ptr is pointer to a pointer to a const int 
int * const * const ptr; // ptr is const pointer to a const pointer to an int 

La regola di base è const applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it.

Problemi correlati