Ссылка
От: BioUnit Россия  
Дата: 18.05.08 10:49
Оценка:
Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая:
"Ссылка — это (её можно представить как) альтернативное имя объекта.

А имя — это идентификатор (п.3/4), т.е. последовательность букв и цифр (п.2.10/1)

А если ссылка является типом возвращаемого значения:
T& func();


То, что считать "альтернативным именем", при вызове этой функции?
func()


Можно сказать, что альтернативным именем является выражение func().
Если да, то как объяснить, что два одинаковых выражения, например:
func() + func()

по сути два альтернативных имени, возможно, даже двух разных объектов?

P.S. Понимаю, что вопросы запутанные и несколько дурацкие, но вопросы терминологии частенько именно такими и бывают
Re: Ссылка
От: LightGreen  
Дата: 18.05.08 11:26
Оценка:
Здравствуйте, BioUnit, Вы писали:

BU>Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая:

BU>"Ссылка — это (её можно представить как) альтернативное имя объекта.

Да, у Страуструпа в глоссарии ссылка определяется именно так. Хотя по существу это синтаксический аналог указателя. Только без возможности явной инициализации нулём. Если бы для ссылок не работал полиморфизм, можно было бы ещё как-то согласиться с таким определением.
Имхо больше подходит "условно разыменованный указатель".
Re: Ссылка
От: Roman Odaisky Украина  
Дата: 18.05.08 11:47
Оценка:
Здравствуйте, BioUnit, Вы писали:

BU>Общепринятая трактовка ссылки, которая в т.ч. упоминается в стандарте, следующая:

BU>"Ссылка — это (её можно представить как) альтернативное имя объекта.

Можно ссылку (;-) на пункт стандарта?

Заодно, альтернативным именем чего является
double const& x = std::rand();
?

Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.

Вообще, в поиск.
До последнего не верил в пирамиду Лебедева.
Re[2]: Ссылка
От: . Великобритания  
Дата: 18.05.08 12:50
Оценка:
Roman Odaisky wrote:

> Заодно, альтернативным именем чего является

>
> double const& x = std::rand();
Альтернативное имя анонимного объекта.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Ссылка
От: BioUnit Россия  
Дата: 18.05.08 12:52
Оценка:
Здравствуйте, 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).
Re[2]: Ссылка
От: Erop Россия  
Дата: 18.05.08 19:37
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.

IMHO, это полезное для понимание упрощение, нор вообще-то стандарт вроде бы даже не гарантирует, что ссылки занимают место в памяти...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: up
От: BioUnit Россия  
Дата: 20.05.08 10:36
Оценка:
Может быть, у кого есть мысли по сабж ?
Re[2]: Ссылка
От: Vamp Россия  
Дата: 21.05.08 15:06
Оценка:
RO>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.
Нихьт. Это опасное и неправильное понимание.
Ссылка сама по себе (в отличии от казателя) не является объектом, и это очень серьезное отличие.

RO>Заодно, альтернативным именем чего является
double const& x = std::rand();
?

Именем анонимного объекта.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Ссылка
От: Roman Odaisky Украина  
Дата: 21.05.08 17:25
Оценка:
Здравствуйте, Vamp, Вы писали:

RO>>Ссылки — это указатели с другим синтаксисом, которые не бывают NULL и которые не меняют адрес, на который указывают.

V>Нихьт. Это опасное и неправильное понимание.
V>Ссылка сама по себе (в отличии от казателя) не является объектом, и это очень серьезное отличие.

void f(int& i)
{
    i = 42;
}

void f(int* i)
{
    // if(i == nullptr) хмм...();
    *i = 42;
}

В чем здесь существенная разница? Линкер даже может сгенерировать по этому коду только одну функцию.

Другое дело, что для кода вроде
int a, b;
int& c = b;
int& d = a;
doSomething(&c, &d);

компилятор не обязан выделять место под c и d, и вообще может заменить сие на doSomething(&b, &a). Впрочем, что с того? Он мог бы и с указателями поступить так же.
До последнего не верил в пирамиду Лебедева.
Re[4]: Ссылка
От: Vamp Россия  
Дата: 21.05.08 17:32
Оценка:
RO>В чем здесь существенная разница? Линкер даже может сгенерировать по этому коду только одну функцию.
Нет-нет-нет. Дело не в размере и не линкере. То, что в наиболее распространенных компиляторах ссылка представляется как указатель, не должно нас смущать. С точки зрения языка ссылка — другое имя, а указатель — объект.
Из этого происходят все различия между ними.
Ссылку нельзя "переуказать" на другой объект, точно так же, как в С++ нельзя переименовать переменную. Ссылка должна быть чем-то инициализирована, потому что когда мы говорим "другое имя объекта", мы подразумеваем, что есть объект и его первое имя. Ссылка продлевает время жизни временного (анонимного) объекта, потому что дает ему новое имя. Если раз и навсегда понять, что ссылка — это просто другое имя, и не более того, что все становится очень просто и разумно.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Ссылка
От: LightGreen  
Дата: 21.05.08 18:33
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Нет-нет-нет. Дело не в размере и не линкере. То, что в наиболее распространенных компиляторах ссылка представляется как указатель, не должно нас смущать. С точки зрения языка ссылка — другое имя, а указатель — объект.

V>Если раз и навсегда понять, что ссылка — это просто другое имя, и не более того, что все становится очень просто и разумно.


Ссылка — это понятие не только времени компиляции, но и реальный объект времени выполнения.
Вот пример кода:

struct Foo
{
   int data_;
};

class Wrapper
{
public:
   Wrapper( Foo& foo ) : foo_(foo) {}
   int get()
   {
      return foo_.data_;
   }
private:
   Foo& foo_;
};

void main()
{
   Foo *p = new Foo;
   Wrapper w( *p );
   delete p;
   w.get();    // < ?
}


В реальном коде ситуация может быть осложнена несколькими уровнями передачи аргументов по ссылке и многопоточностью.
Если вы пишете код самого нижнего уровня, вы просто полагаетесь, что объект существует, т.к. это ссылка.
А на самом верхнем уровне (или в другом потоке) вам кажется, что ссылку никто не держит.
Как же объяснить висячую ссылку, если это просто "другое имя объекта"?
Re[6]: Ссылка
От: Vamp Россия  
Дата: 21.05.08 18:54
Оценка:
А что этот пример доказывает?
Можно и попроще сделать.
int* n = new int(10);
int& rn = *n;
delete n;

rn — другое имя для *n. После удаления другое имя для объекта ссылается на удаленный объект. Бывает.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Ссылка
От: BioUnit Россия  
Дата: 22.05.08 19:12
Оценка:
V>Нихьт. Это опасное и неправильное понимание.

Я тоже сторонник мнения, что ссылку нельзя рассматривать, как указатель.
Но не смог ответить на вопрос: почему рассмотрение, как указатель, опасное?
Ну и пока не могу дать четкого ответа, что же будет именем в случае указанном в топике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.