Здравствуйте, BioUnit, Вы писали:
BU>Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая: BU>"Ссылка — это (её можно представить как) альтернативное имя объекта.
Да, у Страуструпа в глоссарии ссылка определяется именно так. Хотя по существу это синтаксический аналог указателя. Только без возможности явной инициализации нулём. Если бы для ссылок не работал полиморфизм, можно было бы ещё как-то согласиться с таким определением.
Имхо больше подходит "условно разыменованный указатель".
Здравствуйте, BioUnit, Вы писали:
BU>Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая: BU>"Ссылка — это (её можно представить как) альтернативное имя объекта.
Можно ссылку (;-) на пункт стандарта?
Заодно, альтернативным именем чего является
double const& x = std::rand();
?
Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.
Здравствуйте, Roman Odaisky, Вы писали:
BU>>Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая: BU>>"Ссылка — это (её можно представить как) альтернативное имя объекта.
RO>Можно ссылку ( на пункт стандарта?
Да, конечно:
8.3.2 References
1 In a declarationT D where D has the form
& D1
<skip>
[Note: a reference can be thought of as a name of an object. ]
RO>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.
IMHO если это определение, то оно неверное, если — трактовка (представление, истолкование), то очень примитивная, хотя бы потому, что указатель — это объект, а ссылка — нет.
Но это в поиск по форуму (не раз уже обсуждалось).
Я не собираюсь здесь об этом спорить, цель моего топика иная (см.топик).
RO>Заодно, альтернативным именем чего является
double const& x = std::rand();
?
Опять же не собираюсь это обсуждать или спорить. Обратитесь к стандарту (п.8.5.3/5 и п.12.2).
Здравствуйте, Roman Odaisky, Вы писали:
RO>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.
IMHO, это полезное для понимание упрощение, нор вообще-то стандарт вроде бы даже не гарантирует, что ссылки занимают место в памяти...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
RO>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.
Нихьт. Это опасное и неправильное понимание.
Ссылка сама по себе (в отличии от казателя) не является объектом, и это очень серьезное отличие.
RO>Заодно, альтернативным именем чего является
Здравствуйте, Vamp, Вы писали:
RO>>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают. V>Нихьт. Это опасное и неправильное понимание. V>Ссылка сама по себе (в отличии от казателя) не является объектом, и это очень серьезное отличие.
В чем здесь существенная разница? Линкер даже может сгенерировать по этому коду только одну функцию.
Другое дело, что для кода вроде
int a, b;
int& c = b;
int& d = a;
doSomething(&c, &d);
компилятор не обязан выделять место под c и d, и вообще может заменить сие на doSomething(&b, &a). Впрочем, что с того? Он мог бы и с указателями поступить так же.
RO>В чем здесь существенная разница? Линкер даже может сгенерировать по этому коду только одну функцию.
Нет-нет-нет. Дело не в размере и не линкере. То, что в наиболее распространенных компиляторах ссылка представляется как указатель, не должно нас смущать. С точки зрения языка ссылка — другое имя, а указатель — объект.
Из этого происходят все различия между ними.
Ссылку нельзя "переуказать" на другой объект, точно так же, как в С++ нельзя переименовать переменную. Ссылка должна быть чем-то инициализирована, потому что когда мы говорим "другое имя объекта", мы подразумеваем, что есть объект и его первое имя. Ссылка продлевает время жизни временного (анонимного) объекта, потому что дает ему новое имя. Если раз и навсегда понять, что ссылка — это просто другое имя, и не более того, что все становится очень просто и разумно.
V>Нет-нет-нет. Дело не в размере и не линкере. То, что в наиболее распространенных компиляторах ссылка представляется как указатель, не должно нас смущать. С точки зрения языка ссылка — другое имя, а указатель — объект.
V>Если раз и навсегда понять, что ссылка — это просто другое имя, и не более того, что все становится очень просто и разумно.
Ссылка — это понятие не только времени компиляции, но и реальный объект времени выполнения.
Вот пример кода:
В реальном коде ситуация может быть осложнена несколькими уровнями передачи аргументов по ссылке и многопоточностью.
Если вы пишете код самого нижнего уровня, вы просто полагаетесь, что объект существует, т.к. это ссылка.
А на самом верхнем уровне (или в другом потоке) вам кажется, что ссылку никто не держит.
Как же объяснить висячую ссылку, если это просто "другое имя объекта"?
Я тоже сторонник мнения, что ссылку нельзя рассматривать, как указатель.
Но не смог ответить на вопрос: почему рассмотрение, как указатель, опасное?
Ну и пока не могу дать четкого ответа, что же будет именем в случае указанном в топике.