2009-06-23 18 views
72

¿Hay alguna diferencia entre las siguientes declaraciones?parámetros de referencia const

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

Debe tener en cuenta que la referencia es irrelevante para la pregunta: "const Person p" es equivalente a "Persona const p" también. –

Respuesta

91

existe ninguna diferencia . const se une al tipo a su izquierda ... a menos que sea la primera parte de la declaración en cuyo caso se une a la derecha.

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

Personalmente, encuentro que const T &x lee mejor. De acuerdo con this, Bjarne también prefiere poner el const primero. Específicamente porque la palabra clave originalmente se llamaría readonly y readonly int x tiene una mejor lectura :-P.

+1

Aunque yo diría que el primero es más común. – rlbond

+0

@rlbond: Más común depende de un contexto. En ciertos lugares veo el primero más común en otros veo el segundo más común. Todo se desploma. –

+6

ciertamente el segundo es más * consistente * cuando se trata de direccionamiento indirecto. por ejemplo: int const * const x; (todo se une a la izquierda) –

11

ver este http://www.parashift.com/c++-faq-lite/const-correctness.html

(Ver nuevo enlace en su lugar: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)

Específicamente 18,6 a 18,8.

[18.6] ¿Qué significa "const Fred & x" significa?

Significa x alias un objeto Fred, pero x no se puede usar para cambiar ese objeto Fred.

[18.7] ¿Tiene sentido "Fred & const x"?

No, no tiene sentido.

[18.8] ¿Qué significa "Fred const & x"?

Fred const & x es funcionalmente equivalente a const Fred & x. Sin embargo, la verdadera pregunta es cuál debería ser usado.

Lea el resto del artículo para obtener más información. Pero esencialmente, dice que son equivalentes, y puede usar cualquiera de los dos como mejor le parezca. Sin embargo, debes elegir uno y mantenerte con él, para evitar confusiones futuras.

+4

Añadiré, elegiré una y me quedaré con ella cuando escriba código nuevo, pero cuando modifique código existente, siga con la forma en que lo hace el código existente. –

47

Sí, lo hay! el primero es más legible :)

+0

supongo que quiere decir "¡más legible para los que leen LTR!" :) Escuché que algunas personas en el este leen su texto RTL. –

+2

¡No! ¡El segundo! (Realmente, tiene que leer las definiciones de derecha a izquierda: Person const * volátil * p; // p es un puntero volátil a un puntero de cont a una Persona). – MSalters

+1

@litb :: Leí uno de esos idiomas RTL y no es difícil porque es mi lengua materna: D – AraK

4

Realmente es una cuestión de gusto.

Si se lee de derecha a izquierda, "Person const & x" dice "x es una referencia a una persona constante".

Esto suena mejor que "const Person & x", que sería "x es una referencia a una persona, que es constante".

De modo que si uno está familiarizado con la dirección de lectura de derecha a izquierda de las declaraciones de variables, quizás una prefiera la primera.

4

Ambos son iguales.

const Person & x es actualmente el más popular, porque el inglés pone los adjetivos antes que los sustantivos, y eso lo hace "más parecido al inglés".

La forma alternativa, persona const & x, se sugirió como una forma menos idiomática. Su argumento era que esa forma siempre se puede analizar de derecha a izquierda, "x es una referencia a una persona const". El argumento era que la claridad del análisis era más importante que la estructura idiomática.

Desafortunadamente para esas personas, su forma no maneja todo. Una vez que comienzas a ver matrices y punteros de función y otras formas exóticas, las reglas comienzan a descomponerse. char * str [10] no se puede escribir en forma de derecha a izquierda porque la matriz debe estar en el lado derecho. void (* signal (int, void (* fp) (int))) (int) hace que las personas de derecha a izquierda se encojan de dolor.

única regla ha surgido alguna vez hasta dar sentido a todos los tipos, la regla de espiral a la derecha: http://c-faq.com/decl/spiral.anderson.html

Por lo general, una vez que alguien ve la espiral de la agujas del reloj, todas las esperanzas de una regla clara análisis sale por la ventana. La mayoría de la gente acepta que const Persona & x es probablemente la mejor manera de hacerlo!

Cuestiones relacionadas