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.
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.
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
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.
Es un puntero constante a un carácter constante sin signo. No puede cambiar el puntero ni lo que apunta.
const * unsigned char const buffer
significa que no puede modificar el puntero buffer
ni la memoria a la que apunta buffer
.
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).
Un par de artículos para ayudar a entender la corrección const en C++:
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.
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 mutableT & const
habría referencia constante a T mutable, excepto las referencias son constantes, por definición,T const *
es un puntero mutable a T constanteT const &
es una referencia a la constante TT const * const
es constante puntero a T constanteGracias, el consejo de lectura RTL es útil para tales casos. – SyBer
Debe ser 'const unsigned char * const' – wich
IIRC sin firmar const char * const también es válido –
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