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.