Nota: Estoy usando el compilador de g ++ (que según tengo entendido es bastante bueno y se supone que es bastante parecido al estándar).Al declarar una referencia a una matriz de Ints, ¿por qué debe ser una referencia a un puntero const?
Digamos que usted ha declarado una matriz de enteros:
int a[3] = { 4, 5, 6 };
Ahora digamos que usted realmente desea declarar una referencia a esa matriz (no importa qué, que no sea el Bjarne dice el lenguaje lo admite)
Caso 1 - Si se intenta:
int*& ra = a;
entonces las vigas del compilador y dice:
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
Lo primero es lo primero, ¿por qué es 'a' una variable temporal (es decir, no hace que tienen un lugar en la memoria?) ...
de todos modos, bien, cada vez que veo un error de no constante, trato de tirar en una const ...
Caso 2 - si se intenta:
int*const&rca = a; //wish I knew where the spaces should go (but my other post asking about this sort of protocol got a negative rank while many of the answers got ranked highly -- aha! there are stupid questions!)
entonces todo es fresco, compila, y se obtiene una referencia a la matriz.
Caso 3 - Ahora aquí es otra cosa que compilará:
int* justSomeIntPointer = a; //LINE 1
int*& rpa = justSomeIntPointer; //LINE 2
Esto también le da una referencia a la matriz original.
Así que aquí está mi pregunta: ¿En qué punto el nombre de una matriz estáticamente declarada se convierte en un puntero const? Me parece recordar que el nombre de una matriz de ints es también un puntero-a-int, pero no recuerdo que haya sido un const-pointer-to-int ...
Parece que el caso 1 falla porque la referencia declarada (ra) no es const-puntero, lo que puede significar que 'a' ya era un const-pointer-to-int para empezar.
Parece que el Caso 2 funciona porque la referencia declarada (rca) ya es un const-pointer-to-int.
El caso 3 también funciona, lo cual es bueno, pero ¿por qué? ¿En qué punto el puntero supuesto-a-int (es decir, el nombre de la matriz 'a') se convierte en un puntero const? ¿Sucede cuando lo asigna a un int * (LINE 1), o sucede cuando asigna ese int * a un int * & (LINE 2)?
Espero que esto tenga sentido. Gracias.
también lo son variables temporales siempre const? – Jimmy
@Jimmy: los temporales no siempre son const, pero el lenguaje prohíbe vincular uno directamente a una referencia no constante. La matriz 'a' no es temporal, sin embargo, es el puntero que resulta de la conversión de matriz a puntero que es temporal. –
Declarado en la pila significa "tiene una duración de almacenamiento automática", es decir, sale del alcance cuando su bloque/objeto contiene, no "temporalmente". Pocos consideran tener que administrar manualmente los objetos asignados dinámicamente para ser un punto positivo. Lo último que necesitamos es otra idea falsa sobre por qué la asignación dinámica es mejor. Este es especialmente malo porque invoca una definición falsa de _temporary_, un término que tiene un significado muy bien definido y diferente. –