2010-01-28 13 views
8

A menudo veo la siguiente declaración de la función:declaración const doble

some_func(const unsigned char * const buffer) 
{ 

} 

Cualquier idea de por qué la const se repite antes de que el nombre de puntero?

Gracias.

+0

Debe ser 'const unsigned char * const' – wich

+3

IIRC sin firmar const char * const también es válido –

+0

No, que no se ve este tipo de declaraciones "a menudo". La declaración es, de hecho, inválida y, por lo tanto, no tiene sentido. Por favor, tenga más cuidado al publicar el código con sus preguntas. – AnT

Respuesta

17

La primera const dice que los datos apuntaban a es constante y no pueden ser cambiados , el segundo dice que el puntero en sí mismo no puede ser cambiado:

char my_char = 'z'; 
const char* a = &my_char; 
char* const b = &my_char; 
const char* const c = &my_char; 

a = &other_char; //fine 
*a = 'c'; //error 
b = &other_char; //error 
*b = 'c'; //fine 
c = &other_char; //error 
*c = 'c'; //error 
+1

+1 Pero podría sugerir agregar ejemplos que demuestren que los punteros const no pueden ser reasignados. (es decir, 'char * const x = NULL; x = & some_char;') – Eric

+0

@Eric Creo que ya incluí ese 'b = & other_char; // error' – wich

+0

Creo que debo prestar más atención :) Mis disculpas – Eric

1

Esto lo convierte en un puntero const a un valor const, en lugar de un puntero mutable a un valor const o un puntero const a un valor mutable.

3

Es un puntero constante a un carácter constante sin signo. No puede cambiar el puntero ni lo que apunta.

1

const * unsigned char const buffer significa que no puede modificar el puntero buffer ni la memoria a la que apunta buffer.

2

En una declaración como const * const T, la primera const (antes de la *) lo que significa que el puntero apunta a es const (es decir, que es un puntero a una const T). El const después del * significa que el puntero en sí es const (es decir, no se puede modificar para apuntar a otra cosa).

2

asumiendo const unsigned char * const

Todo el mundo está en lo cierto al indicar que se trata de un const unsigned char.

Los tipos de C++ leen principalmente de derecha a izquierda a menos que haya modificadores en el extremo izquierdo, luego estos leen de izquierda a derecha.

7

las declaraciones de tipo deberían (?) Leerse RTL. const modifica la cosa a su izquierda, pero la regla es complicada por el hecho de que puede escribir tanto const T como T const (significan lo mismo).

  • T * const es una constante puntero a T mutable
  • T & const habría referencia constante a T mutable, excepto las referencias son constantes, por definición,
  • T const * es un puntero mutable a T constante
  • T const & es una referencia a la constante T
  • T const * constes constante puntero a T constante
+0

Gracias, el consejo de lectura RTL es útil para tales casos. – SyBer

Cuestiones relacionadas