Aquí está mi teoría sobre eso. Creo que tiene mucho que ver con qué operadores son válidos (sintácticamente) para los símbolos. Considere
int a[1]; // a[1] is valid (syntactically)
int *a; // *a is valid
int a(char, bool); // a(<a char>, <a bool>) is valid (function call)
int C::*a; // <a C>.*a is valid
Conceptualmente, en esas declaraciones lo que se denomina con un tipo (C
, char
, bool
) está sustituido con una expresión de ese tipo más adelante. Por supuesto, la intención es reutilizar la mayor parte del lenguaje existente como sea posible. Así que creo que usó &
:
int &a; // &a is valid
El único importante es que &
es única válida en el tipo de expresión denota una referencia: Para lvalues
. Las referencias son lvalues (variables con nombre son demasiado) y sólo para ellos &
se pueden aplicar:
int &g(); // &g() is valid (taking the address of the referred to integer)
int g(); // &g() is *not* valid (can't apply to temporary int)
Eso tiene sentido. Aunque en mi humilde opinión, todo el concepto de referencias era lo suficientemente extraño para los usuarios de C desde hace mucho tiempo, que tener de repente tener el operador de dirección de tener una semántica diferente puede no haber sido natural ... – Uri
Hmm ... tal vez no deberías mira esto: http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2004/n1690.html –
Acabo de recordar algo de D & EC++ - desea ahora haber insertado una palabra clave 'abstracta' en lugar de usar '= 0' en métodos virtuales; pero la reacción a las nuevas palabras reservadas fue violentamente negativa (aunque, irónicamente, seguramente no habría necesitado ser una palabra reservada) –