2009-03-21 1 views
5

У кого-нибудь есть идея, почему амперсанд был выбран как способ ссылки на C++?Почему амперсанд выбран как символ для ссылок на C++?

AFAIK (хотя у меня нет книги рядом со мной), Stroustroup не объясняет, что выбор, который я нахожу немного странным, потому что тот же символ уже был использован для Адресов в С.

ответ

7

Stroustrup всегда очень неохотно вводил новый зарезервированный символ или имя, поэтому он, вероятно, использовал его, чтобы избежать того, чтобы функция выглядела странно для пользователей C.

+0

Это имеет смысл. Хотя ИМХО, вся концепция ссылок была достаточно странной для долгосрочных пользователей C, что наличие внезапного наличия адреса оператора имеет другую семантику, возможно, не было естественным ... – Uri

+0

Хм ... может быть, вы не должны посмотрите на это: http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2004/n1690.html –

+0

Я только что вспомнил что-то из D & EC++ - он хочет, чтобы теперь он добавил ключевое слово 'abstract' вместо использования '= 0' для виртуальных методов; но реакция на новые зарезервированные слова была сильно отрицательной (хотя, по иронии судьбы, это было бы не обязательно для зарезервированного слова?) –

12

В дополнение к ответу Earwicker, с которым я в целом согласен. Я бы также предположил, что с & является оператором «адрес-из», он несколько подходит. Поскольку ссылка во многих отношениях похожа на переход на адрес вместо значение.

В дополнение к этому, принимая адрес переменной часто упоминается как «ссылки»

(Да, я знаю, что ссылки не имеют быть реализованы с использованием указателей под капотом, я ссылаясь на то, как они концептуально работают).

Это только предположение.

2

Кто знает, почему Страуструп ничего не делает, но я думаю, что потому, что реализация эталонных параметров включает прохождение адреса из Lvalue, Страуструп выбрал C адресно-оператора, поскольку это дало бы Программисты правильное представление о том, модель затрат.

2

Вот моя теория. Я думаю, что это имеет много общего с тем, какие операторы действительны (синтаксически) для символов. Рассмотрим

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 

Концептуально, в этих заявлениях, что названые с типом (C, char, bool) подставляется с выражением этого типа позже. Разумеется, намерение состоит в том, чтобы использовать как можно больше существующего языка. Поэтому я думаю, что он использовал &:

int &a; // &a is valid 

Важным является то, что & является только действует на вид выражения ссылки обозначает: Для lvalues. Ссылки являются lvalues ​​(названные переменные тоже), и только для них & могут быть применены:

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

Я проголосую, но заметьте, что «int & a; // & a is valid» не разрешено без присваивания ... – Klaim

+0

да, я знаю об этом. Я намеренно оставил его неинициализированным, потому что я думал, что не станет более ясным вставить инициализацию = some_int; Аналогично, если бы я определил пустой класс C для случая указателя элемента. Я хотел подчеркнуть их использование в выражениях. спасибо за ваш +1 :) –

+0

, к сожалению, все это ломается с ссылками rvalue в C++ 1x, где это выглядит как int &&a; :) –

2

Моя мысль была, что есть 2 символов, используемых в указателей: * и &. Поскольку int * означает указатель на int, вероятно, Stroustrup не хотел вводить совершенно новый символ. Поскольку ссылки являются своего рода указателями, он застрял с &. Плюс, единственное ранее действительное использование & состояло в том, чтобы принять адрес чего-то, поэтому было хорошо использовать в объявлениях.

Смежные вопросы