2009-03-21 8 views

risposta

7

Stroustrup era sempre molto riluttante a introdurre un nuovo simbolo o nome riservato, quindi probabilmente lo usò per evitare che la funzionalità sembrasse strana agli utenti di C.

+0

Questo ha senso. Sebbene IMHO, l'intero concetto di riferimenti fosse abbastanza bizzarro per gli utenti di C di vecchia data, che dover improvvisamente avere l'indirizzo di un operatore con una semantica diversa potrebbe non essere stato naturale ... – Uri

+0

Hmm ... forse non dovresti guarda questo: http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2004/n1690.html –

+0

Mi sono appena ricordato qualcosa di D & EC++ - desidera che ora inserisca una parola chiave "astratta" invece di usare "= 0" sui metodi virtuali; ma la reazione a nuove parole riservate era violentemente negativa (sebbene - ironia della sorte - sicuramente non avrebbe dovuto essere una parola riservata?) –

12

In aggiunta alla risposta di Earwicker che generalmente condivido. Vorrei anche ipotizzare che dal momento che & è l'operatore "address-of", è piuttosto adatto. Poiché un riferimento in molti modi è come passare da indirizzo anziché da valore.

In aggiunta a ciò, prendendo l'indirizzo di una variabile viene spesso definito come "riferimento"

(sì, lo so che i riferimenti non hanno essere implementato utilizzando puntatori sotto il cofano, io sono riferendosi al modo in cui concettualmente funzionano).

Questa è solo la speculazione.

2

Chissà perché Stroustrup fa niente, ma la mia ipotesi è che, poiché il implementazione di parametri di riferimento consiste nel far passare l'indirizzo di un lvalue, Stroustrup ha scelto il C operatore di indirizzo perché darebbe programmatori C l'idea giusta su il modello di costo.

2

Ecco la mia teoria al riguardo. Penso che abbia molto a che fare con ciò che gli operatori sono validi (sintatticamente) per i simboli. Considerare

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 

Concettualmente, in tali dichiarazioni quello denominato con un tipo (C, char, bool) è sostituito con un'espressione di quel tipo in seguito. Naturalmente l'intenzione è di riutilizzare il più possibile il linguaggio esistente. Quindi penso che ha usato &:

int &a; // &a is valid 

L'importante è che & è valida solo sul tipo di espressione denota un riferimento: Per lvalues. I riferimenti sono lvalue (variabili chiamate sono troppo) e solo per loro possono essere applicati &:

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

Io voto su, ma nota che "int & a; // & a è valido" non è permesso senza assegnazione ... – Klaim

+0

si lo so. L'ho lasciato intenzionalmente non inizializzato perché pensavo che non avrebbe reso più chiaro l'inserimento di un'inizializzazione = some_int; allo stesso modo in cui avrei definito una classe vuota C per il caso del puntatore membro. Volevo evidenziare il loro uso nelle espressioni. grazie per il tuo +1 :) –

+0

purtroppo, tutto questo si interrompe con i riferimenti di rvalue in C++ 1x dove appare come int &&a; :) –

2

Il mio pensiero era che ci sono 2 simboli usati nel puntatori: * e &. poiché int * indica un puntatore a un int, probabilmente Stroustrup non ha voluto introdurre un intero nuovo simbolo. Dal momento che i riferimenti sono simili a puntatori simili, ha bloccato con &. Inoltre, l'unico uso precedentemente valido di & era di prendere l'indirizzo di qualcosa, quindi era OK da usare nelle dichiarazioni.