2009-03-21 3 views

Répondre

7

Stroustrup était toujours très réticent à introduire un nouveau symbole ou nom réservé, donc il l'a probablement utilisé pour éviter de rendre la fonctionnalité bizarre aux utilisateurs de C.

+0

Cela a du sens. Bien que mon humble avis, le concept entier de références était assez bizarre pour les utilisateurs de longue date C, avoir à avoir soudainement l'adresse de l'opérateur ont une sémantique différente peut-être pas naturel ... – Uri

+0

Hmm ... peut-être que vous ne devriez pas regardez ceci: http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2004/n1690.html –

+0

Je viens de me souvenir de quelque chose de D & EC++ - il souhaite maintenant qu'il mette un mot clé 'abstract' au lieu d'utiliser '= 0' sur les méthodes virtuelles; mais la réaction aux nouveaux mots réservés était violemment négative (bien que - ironiquement - sûrement il n'aurait pas eu besoin d'être un mot réservé?) –

12

En plus de la réponse d'Earwicker, je suis généralement d'accord avec cela. Je voudrais également spéculer que puisque & est l'opérateur "adresse-de", il est quelque peu approprié. Depuis une référence de plusieurs façons est comme passant par adresse au lieu de par valeur.

En plus de cela, en prenant l'adresse d'une variable est souvent appelée « référence »

(Oui, je sais que les références ne pas ont à être mis en œuvre à l'aide des pointeurs sous le capot, je suis se référant à la façon dont ils fonctionnent conceptuellement).

Ce n'est qu'une spéculation.

2

Qui sait pourquoi Stroustrup ne fait rien, mais je pense que, parce que la mise en œuvre des paramètres de référence consiste à faire passer l'adresse d'un lvalue, Stroustrup a choisi le C adresse de l'opérateur, car il donnerait aux programmeurs C la bonne idée le modèle de coût.

2

Voici ma théorie à ce sujet. Je pense que cela a beaucoup à voir avec les opérateurs qui sont valides (syntaxiquement) pour les symboles. Considérez

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 

Conceptuellement, dans ces déclarations ce qui est nommé avec un type (C, char, bool) est substituée par une expression de ce type plus tard. Bien sûr, l'intention est de réutiliser autant de la langue existante que possible. Donc, je pense qu'il a utilisé &:

int &a; // &a is valid 

L'important est que & est que valide le type d'expression une référence indique: Pour lvalues. Les références sont lvalues ​​(variables nommées sont trop) et seulement pour les & peuvent être appliqués:

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) 
+0

Je vote, mais notez que "int & a; // & a est valide" n'est pas autorisé sans assignation ... – Klaim

+0

oui j'en suis conscient. Je l'ai laissé intentionnellement non initialisé parce que je pensais qu'il ne serait pas plus clair d'insérer une initialisation = some_int; De même quand j'aurais défini une classe C vide pour le cas du pointeur de membre. Je voulais souligner leur utilisation dans les expressions. merci pour votre +1 :) –

+0

malheureusement, tout cela casse avec des références rvalue en C++ 1x où il ressemble int &&a; :) –

2

Ma pensée est qu'il ya 2 symboles utilisés dans les pointeurs: * et &. puisque int * signifie un pointeur sur un int, probablement Stroustrup n'a pas voulu introduire un nouveau symbole entier. Depuis références sont un peu comme des pointeurs, il est resté avec &. De plus, la seule utilisation valide de & était de prendre l'adresse de quelque chose, donc c'était OK pour les déclarations.

Questions connexes