2009-06-23 31 views
72

C'è una differenza tra le seguenti dichiarazioni?parametri di riferimento const

void somefunc(const Person &p); 
void somefunc(Person const &p); 
+8

Si noti che il riferimento è irrilevante alla domanda: "const Person p" è equivalente a "Person const p" pure. –

risposta

91

non v'è alcuna differenza . const si lega al tipo alla sua sinistra ... a meno che non sia la prima parte della dichiarazione, nel qual caso si lega a destra.

Vedi: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt

Personalmente, trovo che const T &x legge meglio. Secondo this, Bjarne preferisce anche mettere prima il const. In particolare perché la parola chiave originariamente sarebbe stata chiamata readonly e readonly int x si legge meglio :-P.

+1

Anche se direi che il primo è più comune. – rlbond

+0

@rlbond: più comune dipende da un contesto. In alcuni posti vedo il primo più comune in altri, vedo il secondo più comune. Tutto dipende. –

+6

sicuramente il secondo è più * consistente * quando si tratta di indirezione. per esempio: int const * const x; (tutto rimane a sinistra) –

11

Vai a questa http://www.parashift.com/c++-faq-lite/const-correctness.html

(Vedere nuovo link invece: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)

particolare 18,6-18,8.

[18,6] Che cosa significa "const Fred & x" significa?

Significa che x alias un oggetto Fred, ma x non può essere utilizzato per modificare quell'oggetto Fred.

[18.7] "Fred & const x" ha senso?

No, non ha senso.

[18.8] Che cosa significa "Fred const & x"?

Fred const & x è funzionalmente equivalente a const Fred & x. Tuttavia, la vera domanda è che dovrebbe essere utilizzato.

Leggi il resto dell'articolo per ulteriori informazioni. Ma in sostanza, dice che sono equivalenti, e puoi usarne uno come meglio credi. Tuttavia, dovresti sceglierne uno e seguirlo, per evitare confusione futura.

+4

Aggiungo, ne scelgo uno e lo seguo quando scrivo un nuovo codice, ma quando si modifica il codice esistente, attenersi al modo in cui lo fa il codice esistente. –

47

Sì, c'è! il primo è più leggibile :)

+0

immagino che tu voglia dire "più leggibile a quelli che leggono LTR!" :) Ho sentito alcune persone in Oriente leggere il loro testo RTL. –

+2

No! Il secondo! (Davvero - devi leggere le definizioni da destra a sinistra: Person const * volatile * p; // p è un puntatore volatile a un puntatore cont su una Persona.) – MSalters

+1

@litb :: Ho letto una di quelle lingue RTL e non è difficile perché è la mia lingua madre: D – AraK

4

È davvero una questione di gusti.

Se letto da destra a sinistra, "Person const & x" legge "x è un riferimento a una Persona costante".

Questo suona meglio di "const Person & x", che sarebbe "x è un riferimento a una Persona, che è costante."

Quindi, se si ha familiarità con la direzione di lettura da destra a sinistra delle dichiarazioni variabili, si preferirebbe preferibilmente la prima.

4

Entrambi sono uguali.

const La persona & x è attualmente la più popolare, perché l'inglese inserisce aggettivi prima dei nomi e ciò lo rende "più simile all'inglese".

Il modulo alternativo, Persona const & x, è stato suggerito come una forma meno idiomatica. La loro argomentazione era che quel form può sempre essere analizzato da destra a sinistra, "x è un riferimento a una const person". L'argomento era che la chiarezza del parsing era più importante della struttura idiomatica.

Sfortunatamente per quelle persone, la loro forma non gestisce tutto. Una volta che si iniziano a vedere matrici e indicatori di funzione e altre forme esotiche, le regole iniziano ad andare in pezzi. char * str [10] non può essere scritto nella forma da destra a sinistra perché l'array deve essere sul lato destro. void (* signal (int, void (* fp) (int))) (int) rende il diritto a sinistra le persone si lamentano per il dolore.

Solo regola è sempre ritagliata per dare un senso di tutti i tipi, la regola in senso orario a spirale: http://c-faq.com/decl/spiral.anderson.html

Di solito, una volta che qualcuno vede la spirale in senso orario, tutte le speranze di una regola chiara analisi va fuori dalla finestra. La maggior parte delle persone accetta quindi che const person & x è probabilmente il modo migliore per andare!

Problemi correlati