2010-07-14 7 views
45

Par exemple, estconst int = int const?

int const x = 3; 

code valide?

Si oui, est-ce que cela signifie la même chose que

const int x = 3; 

?

+0

au moins dans MSVC – Andrey

+1

Que dit le compilateur? –

+12

@Hamish: certains compilateurs acceptent toutes sortes de codes invalides; la seule façon d'être sûr que quelque chose est valide est de regarder dans la norme, ou demander. –

Répondre

87

Ils sont tous les deux un code valide et ils sont tous les deux équivalents. Pour un type de pointeur, bien qu'ils soient tous deux du code valide mais pas équivalent.

Déclare 2 ints qui sont constantes:

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

Déclare un pointeur dont les données ne peuvent pas être modifiées par le pointeur:

const int *p = &someInt; 

Déclare un pointeur qui ne peut être changé pour pointer vers autre chose:

int * const p = &someInt; 
+2

Et 'const int * const p = & someInt;' vous donnerait un pointeur qui ne peut pas être changé en une valeur qui ne peut pas être changée, si je ne me trompe pas. – JAB

+0

@JAB: Oui, il vous donnera un pointeur qui ne peut pas être changé en plus d'avoir des données qui ne peuvent pas être changées à l'intérieur du pointeur à travers ce pointeur. –

+58

Le motif apparaît ici si les définitions sont ** lues à l'envers **. Par exemple: '[const int *]' = un pointeur ('*') à un 'int' qui est' const'. '[int * const]' = un pointeur 'const' (' * ') vers un' int'. – stakx

15

Oui, c'est exactement la même chose. Cependant, il y a une différence dans les pointeurs. Je veux dire:

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

Ceci est la réponse la plus complète. – anthropomorphic

3

Il en est de même de la signification et de la validité. Pour autant que je sache, const n'est complexe qu'à chaque fois qu'il implique un pointeur.

int const * x; 
int * const x; 

sont différents.

int const * x; 
const int * x; 

sont identiques.

28

Oui, ce sont les mêmes. La règle en C++ est essentiellement que const s'applique au type à sa gauche. Cependant, il existe une exception: si vous le placez à l'extrême gauche de la déclaration, elle s'applique à la première partie du type.

Par exemple dans int const * vous avez un pointeur vers un entier constant. Dans int * const vous avez un pointeur constant vers un entier. Vous pouvez extrapoler cela pour pointer vers des pointeurs, et les Anglais peuvent devenir confus mais le principe est le même.

Pour une autre discussion sur les mérites de faire l'un sur l'autre, voir my question sur le sujet. Si vous êtes curieux de savoir pourquoi la plupart des gens utilisent l'exception, this FAQ entry de Stroustrup peut vous être utile.

+3

Exactement ce que je pensais. 'const int x' est la forme exceptionnelle. 'int const x' correspond au même motif que' int * const x'. Si vous avez besoin d'un pointeur constant vers un int constant, je l'écris habituellement comme 'const const const 'pour la cohérence plutôt que' const int * const'. – Cogwheel

+0

@Cogwheel - Précisément. Une fois que vous vous rendez compte que la forme «normale» de mettre le «const» à l'extrême gauche utilise en fait un cas exceptionnel, la question se pose de savoir de quelle manière rend le code plus clair à long terme. D'où ma question http://stackoverflow.com/questions/988069/in-c-is-const-after-type-id-acceptable –

+0

@ T.E.D. ** La règle dans C++ est essentiellement que const s'applique au type à sa gauche. ** Y at-il une citation pour cela par des gourous de programmation connus ou juste une sorte de chose comprise. Aussi dans le "const int * p1". Il n'y a rien à gauche de const. Comment appliquer la règle dans ce scénario. –

7

De "Effective C++" Article 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

Le commentaire sur votre deuxième élément est incorrect, il doit lire le pointeur non const, les données const. – Thomas

+0

@Thomas Trop lent. ;) L'a réparé. Étant donné que c'est une citation exacte du livre, ça devrait aller. – Bart