c++ - que - punteros en c ejemplos
¿Por qué no funciona una referencia a una matriz hasta que usemos un puntero? (3)
Agregando a lo que ya ha sido respondido, puede obtener una referencia a una matriz como
int a[5];
int (&ref)[5] = a;
Esto funciona muy bien ...
int a[5] = {1,2,3,4,5}, int *p = a;
int *& ref = p;
Pero, ¿por qué esto no funciona?
int a[5] = {1,2,3,4,5};
int*& ref = a;
Tanto a
como p
son punteros y tienen el mismo valor (dirección de a[0]
). Cuando hago referencia a una matriz con un puntero ( p
), funciona muy bien.
Pero cuando hago referencia a esa matriz a[]
directamente, no funciona ... ¿Por qué?
int*& ref = a;
int*
es un tipo de puntero, no un tipo de matriz. Por lo tanto, es por eso que no se unirá a a
, que tiene tipo int[5]
.
Entonces, usa const
int* const& ref = a;
Funciona bien, ya que el nombre de la matriz es una constante de dirección, la referencia no constante no puede referirse a una constante.
a
no es un puntero, es una matriz. Tiene el tipo int[5]
. Lo que puede hacer es decaer a un puntero int*
, que es lo que sucede en el primer caso. Entonces, tomar una referencia a p
está bien.
Ahora para el segundo caso. Recuerde que a
no es un puntero. Entonces, hay una conversión implícita pasando de int[5]
a int*
. El resultado de esa conversión es un valor prve. Pero no puede vincular una referencia de valor l no const (que es lo que ref
) a un valor r. Entonces el código no puede compilarse.
Aquí hay una analogía:
double a = 1.4;
int& b = a; // implicit conversion from ''double'' to `int` results in prvalue
// and you can''t bind non-const lvalue refs to rvalues.