2010-02-23 9 views
11

Observé que no hay referencia a la referencia, pero hay un puntero a puntero y tampoco hay una matriz de referencias, sino una matriz de punteros.C++: ¿por qué no podemos tener referencias a referencias o matriz de referencias?

¿Alguien podría darme alguna razón?

+7

Porque Bjarne Stroustrup lo dice. –

+0

Posible duplicado: http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal –

+1

Tales respuestas aburridas. ¿Qué hay de responder por qué el estándar no lo permite? ¿Hay alguna razón fundamental por la cual C++ no puede soportar referencias de reencuadernación? –

Respuesta

15

Los punteros son mutables (si no son const), nunca referencias. Por lo tanto, no tiene sentido tener un puntero o referencia a una referencia.

Además, una referencia siempre debe referirse a algo: no existe una referencia nula. Esta es la razón por la cual no puede haber matrices de referencias, ya que no hay forma de predeterminar las referencias de instancia dentro de una matriz a un valor significativo.

+1

Ahora que tenemos inicialización de matriz en C++ 11, parece que podría haber matrices de referencias. – Gurgeh

+1

siempre ha habido una inicialización de matriz, y no veo por qué int & refs [2] = {x, y}; es inmoral – Slava

12

Es de acuerdo a C++ estándar 8.3.2/4:

No habrá referencias a referencias, no hay matrices de referencias, y no hay punteros a referencias.

+0

Las referencias rvalue NO son referencias a referencias, aunque su sintaxis '&&' podría sugerir que sí. – fredoverflow

+7

-1 Muy raro para mi votar negativamente, pero realmente quiero decir, ¿cuál es el sentido de esta respuesta? Algunos carteles aquí parecen imaginar que el estándar es una especie de libro sagrado. Primero necesita un lenguaje que sea útil y tenga sentido, solo entonces es necesario un estándar. –

+4

@Bill: ¿Cómo es que uno tiene primero un lenguaje y luego un estándar, cuando los idiomas están definidos por estándares? El lenguaje C++ está * definido * solo por el estándar; cualquier pregunta con respecto a C++ solo puede responderse con información del estándar. ¿Qué propones como respuesta en su lugar? – GManNickG

10

Una referencia es una abstracción en el nivel del idioma. Es una forma opaca de aliasar una variable a otra. Mientras que bajo el capó, es probable que el compilador resuelva referencias utilizando punteros, son cosas muy diferentes en un nivel superior. Por otro lado, los punteros son utilizados explícitamente por un programador para lograr indirección. Una variable de puntero es una variable distinta de lo que apunta. Una referencia debe considerarse como si fuera simplemente un alias de la variable original, no como si fuera otra variable con una dirección. En consecuencia, un alias para un alias de una variable sería simplemente un alias de la variable misma. Teniendo en cuenta el enlace, una referencia a una variable es una cosa en tiempo de compilación que puede ayudar a entender la lógica detrás de este comportamiento.

Con este razonamiento, puede argumentar que, dado que las matrices son estructuras que almacenan valores, no variables, no tiene sentido que puedan almacenar alias de variables. Básicamente, una variable de referencia (con lo que quiero decir el puntero, si existe, que puede ser utilizado por el compilador para cablear la referencia) es invisible para el programador en el nivel de C++. Si era posible declarar matrices de referencias, el compilador probablemente necesitaba requerir índices constantes pasados ​​a las matrices para poder resolver el enlace en tiempo de compilación.

+0

Esta es la única respuesta que realmente explica por qué el estándar no quiere ninguna implementación para permitir matrices de referencias. – Chani

4

C++ estándar 8.3.2/4:

There shall be no references to references, no arrays of references, and no pointers to references.

El razonamiento detrás de esto es que una referencia no existe en sí mismo en tiempo de ejecución. Una referencia simplemente es otro nombre para una ubicación. Ellos son inmutables.

+3

Las referencias ocupan memoria. Compruebe cuál es el tamaño de 'struct X {int & x; largo & x; } 'por ejemplo. –

+0

David, Constructor omitido por simplicidad. –

+0

Existen referencias abundantes en tiempo de ejecución. Verifica tu stack de llamadas en binario. ¡Mira las direcciones apuntan a tus objetos! :) – Macke