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&
?
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&
?
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 const
string
, 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).
Cosa sono 'const int * const' e' int const * const' ....? – Sangram
@ user2745266 Sono entrambi puntatori 'const' su' const' 'int'. –
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
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;
};
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.
Qui non fa differenza. – Rapptz
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
Penso che sia più facile leggere i nomi dei tipi se li metti a destra, ma non fa differenza. – Simple