2010-07-14 12 views
45

Por ejemplo, esconst int = int const?

int const x = 3; 

código válido?

Si es así, ¿significa lo mismo que

const int x = 3; 

?

+0

al menos en MSVC – Andrey

+1

¿Qué dice el compilador? –

+12

@Hamish: algunos compiladores aceptan todo tipo de código inválido; la única manera de estar seguro de que algo sea válido es buscar en el estándar o preguntar. –

Respuesta

87

Ambos son códigos válidos y ambos son equivalentes. Para un tipo de puntero, aunque ambos son códigos válidos pero no equivalentes.

Declara 2 enteros que son constantes:

int const x1 = 3; 
const int x2 = 3; 

declara un puntero cuyos datos no se pueden cambiar a través del puntero:

const int *p = &someInt; 

declara un puntero que no se puede cambiar para que apunte a otra cosa:

int * const p = &someInt; 
+2

Y 'const int * const p = & someInt;' te daría un puntero que no se puede cambiar a un valor que no se puede cambiar, si no me equivoco. – JAB

+0

@JAB: Sí, le dará un puntero que no se puede cambiar además de tener datos que no se pueden cambiar dentro del puntero a través de ese puntero. –

+58

El patrón aquí se vuelve aparente si las definiciones ** son leídas en reversa **. Por ejemplo: '[const int *]' = un puntero ('*') a un 'int' que es' const'. '[int * const]' = un puntero 'const' (' * ') a un' int'. – stakx

15

Sí, eso es exactamente lo mismo. Sin embargo, hay una diferencia en los punteros. Quiero decir:

int a; 

// these two are the same: pointed value mustn't be changed 
// i.e. pointer to const value 
const int * p1 = &a; 
int const * p2 = &a; 

// something else -- pointed value may be modified, but pointer cannot point 
// anywhere else i.e. const pointer to value 
int * const p3 = &a; 

// ...and combination of the two above 
// i.e. const pointer to const value 
const int * const p4 = &a; 
+1

Esta es la respuesta más completa. – anthropomorphic

3

Lo mismo ocurre en cuanto a significado y validez.

Hasta donde yo sé, const solo se vuelve complejo cuando se trata de puntero.

int const * x; 
int * const x; 

son diferentes.

int const * x; 
const int * x; 

son lo mismo.

28

Sí, son lo mismo. La regla en C++ es esencialmente que const se aplica al tipo a su izquierda. Sin embargo, hay una excepción que si lo coloca en el extremo izquierdo de la declaración, se aplica a la primera parte del tipo.

Por ejemplo, en int const * tiene un puntero a un entero constante. En int * const tiene un puntero constante a un número entero. Puede extrapolar esto a puntero a punteros, y el inglés puede confundir, pero el principio es el mismo.

Para otra discusión sobre los méritos de hacer una sobre la otra, vea my question sobre el tema. Si tiene curiosidad sobre por qué la mayoría de la gente usa la excepción, this FAQ entry de Stroustrup's puede ser útil.

+3

Exactamente lo que estaba pensando. 'const int x' es la forma excepcional. 'int const x' se ajusta al mismo patrón que' int * const x'. Si necesita un puntero constante a una constante int, generalmente lo escribo como 'int const * const' para consistencia en lugar de' const int * const'. – Cogwheel

+0

@Cogwheel - Precisamente. Una vez que te das cuenta de que la forma "normal" de poner el 'const 'al extremo izquierdo está haciendo uso de un caso excepcional, surge la pregunta de cuál es la forma en que el código es más claro a largo plazo. De ahí mi pregunta http://stackoverflow.com/questions/988069/in-c-is-const-after-type-id-acceptable –

+0

@ T.E.D. ** La regla en C++ es esencialmente que const se aplica al tipo a su izquierda. ** ¿Hay alguna cita para esto por los gurús de programación conocidos o simplemente algo así como algo entendido? También en "const int * p1". No hay nada a la izquierda de const. Cómo aplicar la regla en este escenario. –

7

De "Eficaz C++" Artículo 21

char *p    = "data"; //non-const pointer, non-const data 
const char *p  = "data"; //non-const pointer, const data 
char * const p  = "data"; //const pointer, non-const data 
const char * const p = "data"; //const pointer, const data 
+0

El comentario a su segundo elemento es incorrecto, debería leer el puntero no const, los datos de const. – Thomas

+0

@Thomas Demasiado lento. ;) Arreglado. Dado que esta es una cita exacta del libro, debería estar bien. – Bart

Cuestiones relacionadas