En C ++, si:

int a = 3; 
int* p = &a; 

Entonces por qué es

const int* &pp = p; 

No permitida, pero

const int* const &pp = p; 

¿esta permitido?

3
unathletic_coder 10 sep. 2018 a las 06:10

3 respuestas

La mejor respuesta

Dado const int* &pp = p;, p tiene que convertirse a const int* implícitamente al principio. Pero el const int* convertido es temporal, y no puede vincularse a lvalue-reference a non-const (como const int* &).

Temporal podría estar vinculado a lvalue-reference a const (como const int* const &) (y rvalue-reference), por lo que const int* const &pp = p; funciona bien. Y la vida útil de lo temporal se extiende a la vida útil de la referencia pp.

5
songyuanyao 12 sep. 2018 a las 00:36

Cuando la const en * izquierda, el const modifica el punto dest, cuando la const en * derecha, el punto del modificador const, y usted pregunta, el addr de var local debe ser constante.

1
Wjiyao 10 sep. 2018 a las 03:29

La razón por la cual la primera conversión no está permitida es porque rompe (sutil e intuitivamente) la corrección constante. Hay una discusión aquí. En resumen, el problema es este:

const int x;
int* p;
const int** q = &p;
*q = &x;
*p = 3;

Si la tercera línea era válida, la cuarta línea establecería p para que apunte a x (porque *q es p), por lo que *p = 3 modificaría {{ X5}}, aunque x es const.

El mismo problema ocurre cuando el modificador de nivel superior es una referencia en lugar de un puntero.

Debe modificar todo o nada al modificar los calificadores const en los tipos de puntero de varias capas.

0
Pete Becker 10 sep. 2018 a las 13:50