ссылки и указатели
В чем принципиальная разница м\у ссылками и указателями, и когда ссылки использовать предпочтительнее:rolleyes:
Все твои аргументы теперь сводятся к следующему:
если в стандарте func() - не имя, то ты вообще все крутишь, как хочешь.
Мы говорили про то, хранит ссылка значение или нет, а не про то является ли func() именем по стандату.
Для чего ты пытаешься запутать обсуждение?
Я пытаюсь понять продолжаешь ли ты утверждать, что твоя интерпретация соответствует стандарту, ведь ты утверждал что ты не выходишь за рамки языка.
Солнце встает на Востоке, что линий раз доказывает правомерность твоей трактовки? :D
Там везеде есть адрес. Где нет адреса - нет ссылки, что я и показал примером.
А как следует из того, что ссылка - это альтернативное имя факт того, что она не может ссылаться на временные объекты?
Ведь если ссылка это альтернативное имя, то почему я не могу написать вот так:
int* b1 = a;
int* b2 = a;
int* b3 = a;
подразумевая:
int* b2 = func();
int* b3 = func();
Не понятно. Ведь если 'a' это альтернативное имя 'func()', то они должны быть взаимозаменяемыми.
Так что мне мешает?
Как видишь, ты тоже порой не понимаешь чего-то... :)
В моем примере понятно что c1 и c2 - это ссылки, а alloc возвращает указатель, в твоем же вообще ничего не задекларировано, и происходит доступ непонятно к чему.
Но ты разыменовываешь этот указатель и получаешь объект, которым уже инициализируешь ссылку.
Так при чем тут адрес?
А почему если что-то содержит адрес, то его нужно обязательно инициализировать указателем?
Может, покажешь сам чего ты хочешь добиться, чем пытаться загнать меня в ловушку.
Я хотел нормального ответа.
Признайся, ты учишься на телепата. Ты все время пытаешься угодать о чем я думаю и что мной движет когда пишу что-то.
Так ты же утверждал, что не выходишь за рамки стандарта, а не я. А раз выходишь - спор исчерпан.
Да ничего я не пытаюсь придать. Хватит приписывать мне то, чего я не делаю.
Ты настаивал на абсолютной точности своей точки зрения тем, что утверждал что она полностью укаладывается в стадарт.
...
Понятная, но неверная. Я могу принять трактовку с "неявным указателем", но вот с адресом не соглашусь.
Так ведь неявный указатель содержит адрес. Как ты их так разделил?
...
Не приписываешь намрянно, но употребляя слово "указатель" вводишь в ряд заблуждений, одним из которых является адрес.
Какие заблуждения? Где? Что следует из того что ссылка внутри это указатель? Ничего.
См. выше "наш ответ ответу Чемберлену". :)
Только к чему этот вопрос, если "неявный указатель" ты тоже трактуешь по своему, а не по стандарту?
Не я говорил, что остаюсь в рамках языка.
Не понял чем оно лучше.
Опять таки вопрос тарктовки.
Ссылку ты можешь создать динамически (например, возвратить из функции), имя - нет. И если я правильно понял, имя это сам вызов функции в твоей трактовке.
Ссылка это нечто содержащее адрес. Т.к. она содержит адрес ее тоже можно назвать синонимом адреса. Это трактовка.
Хоть убей не вижу связи между адресом и ссылкой.
Если адрес, единственное что идентифицирует объект, то ссылка может ссылаться на этот объект только посредством адреса. Все просто.
Будем отделать или нет?
Я давно написал, что не нужно его искать в стандарте.
Соблюдай правила игры, которые сам же и устанавливаешь.
Еще раз, ты говорил, что не выходишь за рамки стандарта. Если выходишь - спор не имеет основы.
Нет. Общее это внутрннее представление (адрес) и возможность получить доступ к объекту..
Значит все же без адреса?
Есть такой оператор &, который возвращает указатель на операнд. И тебе не нужно его применять, чтобы инициализировать неявный указатель, в отличае от указателя.
Потому что она отрезает лишнее, так же как и бритва.
...
А... я понял, ты не говорил ни того ни другого... ни что используют принципы, ни что НЕ используют.
Тогда вопрос: так используют или нет?
Я говорил об этом.
Одинаковые принципы внутреннего представления и разные принципы использования, т.к. интерфейс разный.
Да. Указатель оперирует адресам, но не только. А через них можно получить доступ к объекту.
Это было бы корректнее. Хотя бы потому, что не надо было бы добавлять, что этот указатель неявно разыменовывается, не является объектом и еще пунктов 10 несоответсвий и нюансов.
Потому что непонятно что же такое ссылка. Ты же сам долго не мог определиться с ней.
Я видел 2 принципиально разные трактовки у тебя: другое имя и lvalue другого объекта.
Это все одна трактовка.
Допустим я перешел на другой компилятор, где ссылки реализованы по другому. Если я буду продолжать думать о ссылках как о нечте содержащем адрес, что-нибудь от этого изменится? Я перестану понимать как правильно использовать ссылку?
Да вот не понятно твое понятное.
Не буду, реализация чего угодно не однозначна.
Она не выходит за рамки языка, но т.к. это трактовка, то не является определением.
А как следует из того, что ссылка - это альтернативное имя факт того, что она не может ссылаться на временные объекты?
А кто сказал, что не может?
Может, но при этом срок её жизни должен быть не больше срока жизни объекта.
Ведь если ссылка это альтернативное имя, то почему я не могу написать вот так:
int* b1 = a;
int* b2 = a;
int* b3 = a;
подразумевая:
int* b2 = func();
int* b3 = func();
Не понятно. Ведь если 'a' это альтернативное имя 'func()', то они должны быть взаимозаменяемыми.
'a' - альтернативное имя возвращаемого объекта.
В моем примере понятно что c1 и c2 - это ссылки, а alloc возвращает указатель, в твоем же вообще ничего не задекларировано, и происходит доступ непонятно к чему.
В твоем примере понятно, лишь из контекста и ссылки в нем вообще не при чем.
А почему если что-то содержит адрес, то его нужно обязательно инициализировать указателем?
Потому, что только в этом случае имеет смысл говорить об адресе.
Я хотел нормального ответа.
Ответ: в общем случае НИКАК.
Так ведь неявный указатель содержит адрес. Как ты их так разделил?
Где содержит? В памяти?
Какие заблуждения? Где? Что следует из того что ссылка внутри это указатель? Ничего.
Как ничего? Например это: "Так ведь неявный указатель содержит адрес."
Где содержит, в памяти?
Ссылку ты можешь создать динамически (например, возвратить из функции), имя - нет. И если я правильно понял, имя это сам вызов функции в твоей трактовке.
Не правильно понял. Имя в данном случае - это выражение обозначающее вызов. Два одинаковых выражения, например func() + func(), это уже два альтернативных имени.
Ссылка это нечто содержащее адрес. Т.к. она содержит адрес ее тоже можно назвать синонимом адреса. Это трактовка.
Если адрес, единственное что идентифицирует объект, то ссылка может ссылаться на этот объект только посредством адреса. Все просто.
Еще раз, ты говорил, что не выходишь за рамки стандарта. Если выходишь - спор не имеет основы.
Да. Указатель оперирует адресам, но не только. А через них можно получить доступ к объекту.
Допустим я перешел на другой компилятор, где ссылки реализованы по другому. Если я буду продолжать думать о ссылках как о нечте содержащем адрес, что-нибудь от этого изменится? Я перестану понимать как правильно использовать ссылку?
Да вот не понятно твое понятное.
Там везеде есть адрес. Где нет адреса - нет ссылки, что я и показал примером.
Только здесь ссылка не завязана на адрес. Ты пытаешься сделать подмену выводов.
Нет объекта - нет ссылки. Вот это верно.
А то, что объект располагается в памяти по определенному адресу - это проблемы объекта, а не ссылки.
Ссылка ссылается на объект, а не на его адрес.
Указатели, адреса и т.п. достались ООП С++ от неООП С.
Ссылки - это одна из деталей ООП языка, хотя С++ довольно странный ООП язык.
В большинстве ООП языков есть такое понятие, как ссылка, и в этих языках к объектам получают доступ с помощью ссылок, а не указателей или адресов. Во многих (если не во всех) ООП языках вообще не оперируют адресами и получают доступ к объектам не по их адресам. Да и не возможно получить адрес объекта в памяти, т.к. объект этот может лежать в каждый момент времени в разных адресах, при этом оставаясь все тем же объектом.
Теперь вернемся к C++. Если я могу рассматривать ссылку как просто доступ (ссылание) на объект (а ведь могу же, раз в других языках могу), то зачем мне заморачиваться с адресами? Почему бы мне не продолжать мыслить с т.з. ООП концепции? Зачем переходить на более низкий уровень?
В C# ты же не рассматриваешь ссылку, как указатель? А в Python? А в Java?
Тогда, зачем её рассматривать так в C++ ?
А вообще, если рассуждать как Nixus, то все переменные в C++ - это неявные указатели, даже простые переменные, так как их адрес можно узнать и значит они неявно хранят свой адрес...
Как не выходит, если ты вводишь новые понятия?
Может, но при этом срок её жизни должен быть не больше срока жизни объекта.
В данном примере не может.
И func() альтернативное имя возвращаемого объекта, значит они взаимозаменяемы. Да?
Как это не при чем?
Почему?
int a = 'c';
Тут нет смысла говорить о int, т.к. мы инициализируем его не int'ом?
В памяти.
Где содержит, в памяти?
В ней родимой.
Так что же такое это "альтернативное имя"? Просто выражение? Т.е. lvalue ссылающееся на объект? Так при чем тут ссылки тогда?
Нет объекта - нет ссылки. Вот это верно.
Я тебе уже показал, когда есть объект и нет ссылки.
Ссылка ссылается на объект, а не на его адрес.
Посредством адреса.
Ссылки - это одна из деталей ООП языка, хотя С++ довольно странный ООП язык.
В большинстве ООП языков есть такое понятие, как ссылка, и в этих языках к объектам получают доступ с помощью ссылок, а не указателей или адресов. Во многих (если не во всех) ООП языках вообще не оперируют адресами и получают доступ к объектам не по их адресам. Да и не возможно получить адрес объекта в памяти, т.к. объект этот может лежать в каждый момент времени в разных адресах, при этом оставаясь все тем же объектом.
При чем тут трактовка и реализация? Ведь, если есть возможность, что ссылка будет реализована через указатели, то о ней можно думать так всегда. Это абсолютно ни чему не повредит.
Так ты можешь думать о ссылке все что угодно, я тебя ни к чему не призываю. Я лишь показываю почему твоя трактовка не полная.
Так я и там могу их так рассматиривать. При чем тут другие языки?
Потому что это позволяет лучше понять как работает ссылка, в отличае от непонятного "алтернативного имени", которое у тебя может быть чем угодно, лишь бы употребить слово "имя" в контексте ссылки.
ЗЫ. Я с тобой был бы полностью согласен, если бы ссылки не могли бы быть безымянными. Но т.к. ссылки могут быть без имени (так же как объекты), то ссылки - это неяный указатель.
Так в этом мире все не однозначно и зависит от точки сборки. :)
Так и понятия не выходят.
Именно потому, что срок её жизни должен быть не больше срока жизни объекта.
И func() альтернативное имя возвращаемого объекта, значит они взаимозаменяемы. Да?
Я тебе уже показал, когда есть объект и нет ссылки.
Рекомендую выяснить для себя что есть время существования и область видимости.
Как это не при чем?
Вот так это, не при чем.
Почему?
int a = 'c';
Тут нет смысла говорить о int, т.к. мы инициализируем его не int'ом?
Как раз таки int'oм.
В памяти.
В ней родимой.
Вот, видишь, налицо твое заблуждение.
Ссылка не обязана храниться в памяти.
Так что же такое это "альтернативное имя"? Просто выражение? Т.е. lvalue ссылающееся на объект? Так при чем тут ссылки тогда?
При том, что ссылка и есть частный случай lvalue ссылающееся на объект.
Посредством адреса.
Об этом и весь разговор. НЕТ не посредством адреса.
Ты можешь привести конкретные факты?
При чем тут трактовка и реализация? Ведь, если есть возможность, что ссылка будет реализована через указатели, то о ней можно думать так всегда. Это абсолютно ни чему не повредит.
Так сылка может быть реализована и не через указатель. Значит о ней можно думать не как об указателе?
И кому это повредит?
Так я и там могу их так рассматиривать. При чем тут другие языки?
Ты можешь их так рассматрива, как и считать компьютер магическим устройством.
Но только это бессмысленно, если не сказать глупо.
А другие языки тут при том, что C++ можно рассматривать с т.з. концепции ООП и терминологию связывать с ООП.
Потому что это позволяет лучше понять как работает ссылка, в отличае от непонятного "алтернативного имени", которое у тебя может быть чем угодно, лишь бы употребить слово "имя" в контексте ссылки.
Покажи, где оно "что угодно"?
Это скорее твой неявный указатель, что угодно только не указатель.
Кто сказал, что твое представление помогает лучше понять?
Мне вот проще как-то без указателя... адресов и т.п.
ЗЫ. Я с тобой был бы полностью согласен, если бы ссылки не могли бы быть безымянными. Но т.к. ссылки могут быть без имени (так же как объекты), то ссылки - это неяный указатель.
Только тебе понятная логика...
"т.к. ссылки могут быть без имени, то они - неявный указатель" :D
А зачем ей обязательно имя? Она сама по себе является именем.
При этом заметь, что тебе мешает согласиться всего одна нестройность трактовки.
А сколько оговорок у твоей трактовки? Там же их больше десятка.
Что за стнадарт такой без понятий?
А как это следует из того, что ссылка - это альтернативное имя?
Зачем мне выяснять то, что я уже знаю?
Ну если ты там не видишь ссылки, то конечно не при чем. :D
Где? Покажи, где в коде int при инициализации?
Ссылка не обязана храниться в памяти.
Не обязана. И моей трактовке это никак не мешает.
Так что такое альтернативное имя? Можешь дать четкое определение?
Разыменование указателя - частный случай lvalue. Получается *p это тоже имя?
Ты можешь привести конкретные факты?
Какие факты? Это трактовка.
И кому это повредит?
Никому. Я что против?
Так ты тоже можешь рассматривать ссылку как некое магическое имя.
В чем глупость? В том что ты однажды прочел в одной книжке и теперь считаешь по-другому?
А что у нас есть станадарт на концепцию ООП? :)
func(), a+b, ... - все что угодно.
Кто сказал, что твое представление помогает лучше понять?
Я сказал.
Так пожалуйста, я не против. Однако я не вижу, чем твоя трактовка лучше и понятнее.
Да-да. Имя это такое магическое слово, которое является любым выражением. Тогда я задекларирую переменную вот так:
int a+b;
Ведь, a + b - это имя. Ой, не выходит.
Так она принципиальна.
Ни одной.
ISO/IEC14882
А как это следует из того, что ссылка - это альтернативное имя?
А как ты себе представляешь имя, существующее дольще, чем объект?
Ну если ты там не видишь ссылки, то конечно не при чем. :D
Ну так объясни, что ты хотел показать тем примером?
Где? Покажи, где в коде int при инициализации?
См. 8.5/14, 4.5 и 4.7
Не обязана. И моей трактовке это никак не мешает.
А как же это: "В памяти. В ней родимой."
Так что такое альтернативное имя? Можешь дать четкое определение?
Разыменование указателя - частный случай lvalue. Получается *p это тоже имя?
Давал выше.
Я - частный случай человека. Ты - тоже частный случай человека. Получается, что я - это ты?
Какие факты? Это трактовка.
При чем тут трактовка. Ты заявляешь, что ссылка ссылается посредством адреса. Так вот обоснуй свое заявление.
В чем глупость? В том что ты однажды прочел в одной книжке и теперь считаешь по-другому?
В том, что в этих языках не оперируют адресами. И объекты там лежат не по конкретным адресам.
Я сказал.
Так она принципиальна.
Ну это опять же "ты сказал".
Ни одной.
И это опять же только ты сказал. Хотя выше я перечислял множество отличий от указателя.
Это указатель, которорый
- неявно разыменовывается,
- не является объектом,
- значение которого может не храниться в памяти,
- над которым нельзя совершать операции,
- неизменяем,
- обязательно инициализируется при создании,
- не может быть инициализирован адресом,
- не может быть инициализирован нулевым значением,
- и т.д. продолжи сам.
Хороший стандарт, без понятий. :)
Я себе вообще не представляю как можно динамически создать имя в C++. Имя - это только употребление идентификатора.
То, что ссылки там оперируют объектами через адреса, возвращенные в указателях, и никак иначе не могут.
А где код?
Может не будем ссылаться на стандарт раз ты сам ему противоречишь? Кажется кто-то про правила игры говорил и это был не я.
Что ты все пытаешься часть своей трактовки впихнуть в мою? Твоя трактовка не отрицает занимание ссылкой памяти и моя не отрицает. В чем проблема?
Видел только, что альтернативное имя - это любое выражение.
Если исходить из того что я и ты характеризуются только как "частный случай человека", то да. :) Но у нас же есть отличие, хотябы, в именах на этом форуме.
Однако, это не приближает нас к тому что же такое альтернативное имя и почему *p не альтенативное имя.
Как при чем трактовка? У ссылки вдруг появилось определение? Я не заявляю, а излагаю трактовку. Ты путаешь.
При чем тут трактовка и реализация?
Ну объясни как имя можно возвратить из функции?
А где я говорю, что ссылка - это указатель и они одиноаковы? Ты приписываешь мне не мои слова, а свои фантазии.
Первичным в моей трактовке является то, что ссылка ссылается на объекты посредством адреса. Перечитай на что ты возмутился. Остальное лишь следствие, что ссылку можно назвать неявным указателем, т.к. в C++ нет других сущностей оперирующих адресами, кроме указателей.
ЗЫ. Давай определимся сылаемся мы на стандарт или нет?
Я себе вообще не представляю как можно динамически создать имя в C++. Имя - это только употребление идентификатора.
А я не понимаю, как можно создать "неявный указатель", который указателем и не является.
То, что ссылки там оперируют объектами через адреса, возвращенные в указателях, и никак иначе не могут.
Никак не вижу этого из твоего примера.
Ссылки там ссылаются на объекты, а адреса опять же не при чем.
Если ссылки ссылаются через адреса, тогда зачем там оператор * ?
Как только ты разыменовал указатель, ты работаешь с объектом. Всё, про указатель можешь забыть!
Так что твои malloc-и в примере совершенно лишние.
А где код?
Может не будем ссылаться на стандарт раз ты сам ему противоречишь? Кажется кто-то про правила игры говорил и это был не я.
А при чем тут правила игры и стандарт в данном случае. Этот твой пример как-то оперирует ссылками? К чему он тут вообще?
Что ты все пытаешься часть своей трактовки впихнуть в мою? Твоя трактовка не отрицает занимание ссылкой памяти и моя не отрицает. В чем проблема?
Твоя именно обязывает занятие ссылкой памяти, иначе, где ей хранить адрес?
Видел только, что альтернативное имя - это любое выражение.
Как при чем трактовка? У ссылки вдруг появилось определение? Я не заявляю, а излагаю трактовку. Ты путаешь.
Не тупи. Обоснуй, почему ссылка хранит и ссылается по адресу?
При чем тут трактовка и реализация?
При чем тут реализация? Я не говори о реализации, я говорил о ООП и языках.
Где ты нашел реализацию?
Ну объясни как имя можно возвратить из функции?
А как можно создать неявный указатель?
А где я говорю, что ссылка - это указатель и они одиноаковы? Ты приписываешь мне не мои слова, а свои фантазии.
Ну так и альтернативное имя - это не идентификатор, а способ доступа схожий со способом обычных идентификаторов.
Только вот ты придрался к единственному, что имя - это обязательно идентификатор. А то что твой "неявный указатель" не является указателем по целому перечню пунктов ты как-то упускаешь.
Первичным в моей трактовке является то, что ссылка ссылается на объекты посредством адреса. Перечитай на что ты возмутился. Остальное лишь следствие, что ссылку можно назвать неявным указателем, т.к. в C++ нет других сущностей оперирующих адресами, кроме указателей.
Ну я от этого и не отказываюсь. Ссылка не оперирует адресом, не ссылается на объекты посредством адреса. Она ссылается на объекты так же, как и имя (идентификатор).
ЗЫ. Давай определимся сылаемся мы на стандарт или нет?
А что нам мешает на него ссылаться? То что у него нет адреса? :D :D
Твоя трактовка не соответсвует стандарту, т.к. в нем нет "альтернативного имени". Так же и моя не соответсвует т.к. я представляю ссылку как нечто хранящее адрес.
Соответственно, стандарт уже нарушен и приведение цитат и ссылок на него не правомерно. Так что давай определяться или мы не используем ссылки на него, т.к. обе трактовки его нарушают, или заканчиваем спор, т.к. он не имеет смысла тогда.
Я не понимаю, а при чем тут соответсвие стандарту специально введенного термина из какой либо "трактовки"? Есстественно термина такого там нет, главное чтоб описывался смысл этого термина и он не противоречил стандарту. Смысл как то противоречит? )
Неявного указателя там тоже нет, однако мне это "вминялось в вину" и до сих пор происходит сравнение его с указателем и на этой почве попытки показать глупость моей трактовки.
Выражение и имя - это разные вещи. Имя - это только часть выражения, а точнее употребление идентификатора.
Одинаковая ситуация у альтернативного имени и имени (по стандарту) с неявным указателем и указателем (по стандарту). Какой смысл ссылаться на стандарт когда обе трактовки вводят свои сущности?
ЗЫ. Кстати, раз ты решил вернуться в дисскусию, где обещанные тобой главы стнадарта где описывается, что же такое ссылка, и варианты реализаций, кучу которых ты можешь напридумывать?
Ну я думаю имеется ввиду, что твое определение противоречит некоторым пунктам стандарта, а не то что там такая формулировка есть. Суть то не в том какая трактовка - а в том чтобы она была не сама не противоречива, не противоречила стандарту и подходила под описание там.
ЗЫ. Кстати, раз ты решил вернуться в дисскусию, где обещанные тобой главы стнадарта где описывается, что же такое ссылка, и варианты реализаций, кучу которых ты можешь напридумывать?
Да, давно не был тут - работы навалило. Главы с описанием ссылок тут уже без меня привели - видел пока перечитывал.
Варианты реализаций без адреса объекта в памяти внутри ссылки - ну сейчас подумаем.
Например вариант от Одисея - ссылка ссылается по индексу в массиве весх существующих объектов. Чтобы не было вопросов как быть при разыменовании какого то адреса и присвоении ссылки - если оно не проходит - получаем AV, проходит - добавляем в массив.
Или так: сыслка ключ в многомерном ассоциативном массиве объектов. )))
Ну вобщем сходу думать лениво - на досуге могу придумать что нибудь попрактичней. )
Я не даю определение - я даю трактовку.
Твоя трактовка не противоречит стандарту?
Обоснуй. Покажи противоречия в том, что ссылка хранит адрес и поведением ссылки, описанным в стандарте.
И покажи трактовку, которая полностью укалыдвается в стандарт.
Так, понятно, значит не можешь.
Например вариант от Одисея - ссылка ссылается по индексу в массиве весх существующих объектов. Чтобы не было вопросов как быть при разыменовании какого то адреса и присвоении ссылки - если оно не проходит - получаем AV, проходит - добавляем в массив.
Или так: сыслка ключ в многомерном ассоциативном массиве объектов. )))
А чем этот индекс - не адрес? Индекс в памяти - кажется так стандарт определяет адрес.
Ты только подтверждаешь мою трактовку, что ссылка хранит значение. А ссылка (по стандарту) не обязана же занимать память, поэтому в доказательство своей позиции (что ссылка не обязана ничего хранить и это всего лишь другое имя) приведи реализацию ссылки без хранения ею какого-либо значения.
Ну так подумай, я не тороплюсь.
Твоя трактовка не противоречит стандарту?
Ты вводишь определения. И описываешь их в "своей трактовке".
А никакую свою я вобще не приводил. Это вы тут спорите о трактовках, я же пытаюсь вам общий язык найти помочь. Ато такое чувство что не понимаете, что соперник говорит. )
Так, понятно, значит не можешь.
Мне тоже понятно - что не желаешь читать, что пишут тебе. Не поверю, что ты не видел те цифры которые здесь были. Вот если честно не видел - специально найду и выложу еще раз. )
А чем этот индекс - не адрес? Индекс в памяти - кажется так стандарт определяет адрес.
Я знал, что ты это спросишь. )
А тем что ты говорил, что ссылка это указатель с другим интерфейсом. И значит хранит тот же адрес, что и указатель на этот объект, т.е. адрес самого объекта. А она хранит лишь индекс в массиве, где может уже находиться адрес объекта. Выходит не совпадают адреса? )
А реализация с ключем в ассоциативном массиве? нету вобще адреса - сама ссылка и есть ключ. )
Ты только подтверждаешь мою трактовку, что ссылка хранит значение. А ссылка (по стандарту) не обязана же занимать память, поэтому в доказательство своей позиции (что ссылка не обязана ничего хранить и это всего лишь другое имя) приведи реализацию ссылки без хранения ею какого-либо значения.
Я прошлый раз обещал показать реализацию сылки не через указатели, а не ссылку без значения. ) Вот они. И они альтернативные твоей, значит это не единственный возможный способ организации ссылок.
Можно будет подумать и над ссылкой без значения - но это будет на несколько другом уровне.
Ты только подтверждаешь мою трактовку, что ссылка хранит значение. А ссылка (по стандарту) не обязана же занимать память, поэтому в доказательство своей позиции (что ссылка не обязана ничего хранить и это всего лишь другое имя) приведи реализацию ссылки без хранения ею какого-либо значения.
Индекс в памяти может и адрес, только речь то идет не о индексе в памяти, а о индексе в структуре данных. Разница ясна?
Пример кончено не важный, но первое что пришло в голову. Придется работать с ним. Что хранить, где хранить... Вот ссылка в такой реализации - индекс, например.
void foo::a(Refer r); // Refer - наш тип реализующий механизм ссылок
...
f.a(4); // 4 - это ссылка.
Что хранит 4 ? =)
Теперь по сути.
Не знаю почему вы отказались от общего понятия ссылки и указателя. Общее складывается из частных случаев, и рассматривая частный случай, не рассматривать общий... странно. Ссылка и указатель в языках программирования разные понятия, и нет ни каких предпосылок определять ссылку как вырожденый случай указателя.
Более того, такая трактовка ссылки как "неявный указатель" некорректна и может вводить в заблуждение при изучении языка, когда расчитываешь найти те свойства которых заведомо нет.
Более того, такая трактовка ссылки как "неявный указатель" некорректна и может вводить в заблуждение при изучении языка, когда расчитываешь найти те свойства которых заведомо нет.
особенно, если начать изучать язык, где есть ссылки и нету указателей :)
Особенно в 1Цэ
Документ.Ссылка (Документ.НеявныйУказатель :))) )
Справочник.Ссылка
А указателей нету...
А никакую свою я вобще не приводил. Это вы тут спорите о трактовках, я же пытаюсь вам общий язык найти помочь. Ато такое чувство что не понимаете, что соперник говорит. )
Да, но возражал ты только мне. С Green'ом ты стало быть согласен.
Цифры я видел, но большиснтво из них касалось не ссылок. Всеобъемлещего описания никто не приводил, а ты кажется обещал.
А тем что ты говорил, что ссылка это указатель с другим интерфейсом.[/QUOTE]
Как реализация связана с трактовкой?
А она хранит лишь индекс в массиве, где может уже находиться адрес.
Т.е. опосредованно, но адрес таки хранит?
А кто утверждал что совпадают?
Ключем ассоциативного массива является значение объекта. Значит сссылка - это объект?
Я не утверждаел что единственный. Я говоил что трактование ссылки как нечта содержащиего адрес - самое полное.
Для начала хочеться услышать от тебя что такое ссылка. А то ты тут рассказываешь нам про отличия ссылки от указателя, однако что же такое ссылка не соизволил сказать.
Т.е. скатываемся к реализации? Память - это место где храняться объекты и не важно как она реализована.
void foo::a(Refer r); // Refer - наш тип реализующий механизм ссылок
...
f.a(4); // 4 - это ссылка.
Что хранит 4 ? =)
4 - это не ссылка, это константа, которая инициализирует объект, созадающийся при вызове функции. При чем тут 4?
И при чем тут ссылка и тип, который реализует функционал ссылки в программе? Это разные вещи.
Не знаю почему вы отказались от общего понятия ссылки и указателя.
Кто решает что и где общее и почему общее самое верное? Большинство народу думает что тюль женского рода, они по твоему правы?
Где я отменяю общие свойтсва ссылки? Как моя трактовка отменяет какие-то свойства ссылки?
Собственно вопрос.. ты хоть понял суть трактовки или как и все начинаешь спорить не разобравшись как религиозный фанатик?
Ссылка и указатель в языках программирования разные понятия
Ох... Ты похоже не читал весь топик, раз опять пишеш глупости. Я уже наверное 100 раз писал: Ссылка и указатель - разные вещи, Р А З Н Ы Е!
Однако, я считаю, что ссылку можно рассматривать как нечно хранящее адрес. Так же как и указатель хранит адрес, однако интерфейс у них разный. А так как доступ по адресу можно получить (согласно станадрту) только разыменовав указатель, то можно рассматривать ссылку как нечно неявно разыменовывающее адрес (указатель).
Ключевой момент это внутренне представление (адрес), а интерфейс использования.
Есть и их много. В подавляющем большинстве случаев они взаимозаменяемы.
Так какие заблуждения? У меня, например, возникают заблуждения когда ссылку рассматривают как другое имя.
Я с тобой не спорил, лишь заметил что трактовкая "неявный указатель" вводит в заблуждения и описал почему.
То что ты умный и образованный человек я вижу, но надеюсь ты еще умеешь слушать собеседника.
Просил реализацию механизма ссылок - получил. Да он не безупречный, но основную идею помоему отражает.
Потом, не надо думать что все на тебя нападают, к чему эти выпады про "глуппость", "фанатик" ? Я вот вижу фразу
и меня от нее в дрожь бросает, но я терплю =)
Давать определение ссылки не буду, дабы не умножать демагогию.
А есть ещё языки описания хардвэйра. Типа VHDL или Handel C. Ссылки там есть. Указателей нету :D
И ссылку уж точно через указатель не определить, скорее как привязку к электрическим сигналам слайса (минимальный программируемый логический модуль) ПЛИС, а все объекты по своей сути статичны. Таким образом все ссылки на объекты разрешаются на этапе компиляции - генерирования нет-листа для прошивки ПЛИС.
З.Ы. Будем утверждать что "адрес" это координаты слайса в ПЛИС?
Да я не вижу почему, вот серьезно. И я не настаиваю на единственности своей позиции. Я лишь отстаиваю ее право на жизнь.
Я хотел увидеть реализацию ссылок без хранения ими каких либо знаений, а реализация с каким-либо значение сводиться к адресу/индексу, что совпадает с моей трактовкой.
Просто мне неоднократно приходиться разжевывать свою позицию, т.к. все видят только слово "указатель" почему-то.
Однако это так, конечно только для тех языков где есть и ссылки, и указатели :).
Тебе показать языки, в которых есть указатели и нет ссылок. И языки где нет ни того ни другого? К чему этот опус в данном вопросе?
Так ты не дал ни одного определения ссылки, а уже утверждаешь как ее можно определить, а как нельзя.
Как указатель ее определить нельзя, а вот как нечто ссылающееся через адрес - легко.
З.Ы. Будем утверждать что "адрес" это координаты слайса в ПЛИС?
А как связяана ПЛИС со ссылками?
ЗЫ. Приведи свою трактовку, чтобы было о чем говорить. И вообще что ты пытаешься опровергнуть или доказать?
Ок. Предпочитаю мыслить широко и не замыкаться на одном языке. Ссылка - это способ обращения к объекту через контекстно-зависимое имя в тексте программы (т.е. имя, которое несет смысл только в некотором месте текста - имя формального параметра например). Т.о. любое имя, связанное с объектом (будь то функция, класс и локальная переменная) в тексте программы будет ссылкой на него. type& в С++ - это всего лишь способ получения еще одной ссылки на объект. Именно из-за возможности создания множества ссылок на один и тот же объект возникает потребность в использовании механизма указателей внутрях ссылки - но это всеголишь частный случай.
А как связяана ПЛИС со ссылками?
В ПЛИС нет адресов. Но ссылки в моей трактовке имеют место быть.
[quote=Nixus]
Просто мне неоднократно приходиться разжевывать свою позицию, т.к. все видят только слово "указатель" почему-то.[/quote]
Мы на русском языке говорим. Для русскоязычного человека в словосочетании "неявный указатель" слово указатель (существительное) - главное. Так что определение нескладное уже по самой форме, и вводит слушателя в заблуждение.
Ты знаешь что в разных языках свойтсва ссылки разнятся?
Устал показывать пример. Ссылка есть, а где тут имя?
func() = 10;
Т.е. все переменные в C++ это ссылки?
Так почему нельзя ее так рассматривать всегда? Что от этого измениться?
Так там и ссылок нет.
Что такое "Бритва Оккама" знаешь?
ЗЫ. Прежде чем то-то писать перечитай всю тему, чтобы не боянить. Договорились?
ЗЫЫ. Так что ты пытаешься опровергнуть или доказать?
Соответственно, стандарт уже нарушен и приведение цитат и ссылок на него не правомерно.
Так что давай определяться или мы не используем ссылки на него, т.к. обе трактовки его нарушают, или заканчиваем спор, т.к. он не имеет смысла тогда.
Это ещё почему? С чего он нарушен?
В стандарте нет определения ссылки, только и всего.
Моя трактовка никак не нарушает стандарт.
Я и далее намереваюсь ссылаться на стандарт там, где в этом будет необходимость.
"Вменялось в вину" не отсутствие в стандарте "неявного указателя", а то, что термин "указатель", который есть в стандарте, применим с огромной (а несколько пунктов) натяжкой.
[QUOTE=Odissey_]
, и нет ни каких предпосылок определять ссылку как вырожденый случай указателя.
Есть и их много. В подавляющем большинстве случаев они взаимозаменяемы.
[/QUOTE]
Много? Перечисли.
IMHO куда логичнее определять указатель через ссылку.
Устал показывать пример. Ссылка есть, а где тут имя?
func() = 10;
Т.е. все переменные в C++ это ссылки?
А я устал повторять, что "альтернативное имя" - это не идентификатор.
Ссылка - всего лишь способ доступа к объекту, схожий (идентичный) с доступом по имени.
Переменная = имя + объект
Все имена в С++ используют способ аналогичный тому, что используют ссылки. В принципе, можно сказать, что имена переменных - это и есть ссылки на объекты.
С того что имя там четко определено и оно не может быть произвольным выражением.
Моя трактовка никак не нарушает стандарт.
Я и далее намереваюсь ссылаться на стандарт там, где в этом будет необходимость.
Значит больше не ссылаемся на то что ссылка это не объект и не обязана хранить значние (занимать память)?
Значит будем мериться количеством пунктов? :D
Проще скзать когда они не взаимозаменимы:
1. Ссылку нельзя использование в union.
2. Ссылку обязательно нужно инициализировать.
В остальных случаях - пожалуйста.
Т.е. указатель это ссылка?
То же самое можно сказать про указатель.
Указатель - способ доступа к объекту, схожий (идентичный) с доступом по имени. :)
А никто не говорил об имени, разговор был об альтернативном имени.
Кроме того, есть два случая:
1) именованная ссылка,
2) неименнованная.
В первом случае вообще все попадает под стандарт. Во втором несколько сложнее. Но для понимания сути ссылки хватает и первого варианта.
Значит больше не ссылаемся на то что ссылка это не объект и не обязана хранить значние (занимать память)?
Именно на это и ссылаемся.
Ты так активно пытаешься отвертеться от стандарта... :)
Видимо, ты и сам понимаешь, что в этом и слабость твоей трактовки.
Значит будем мериться количеством пунктов? :D
А почему бы нет. Если ты утверждаешь, что твоя трактовка понятнее.
Проще скзать когда они не взаимозаменимы:
1. Ссылку нельзя использование в union.
2. Ссылку обязательно нужно инициализировать.
В остальных случаях - пожалуйста.
Ну это ведь далеко не все.
Т.е. указатель это ссылка?
Нет, указатель - это не ссылка.
Указатель - это объект, к которому может быть применена операция разыменования, в результате которой получаем доступ к другому объекту, т.е. в общем случае - ссылку.
Указатель - способ доступа к объекту, схожий (идентичный) с доступом по имени. :)
Вижу сам улыбаешься той фигне, которую сказал :)
Кроме того, есть два случая:
1) именованная ссылка,
2) неименнованная.
В первом случае вообще все попадает под стандарт. Во втором несколько сложнее. Но для понимания сути ссылки хватает и первого варианта.
Для понимания второго случая альтернативного имени как раз не хватает.
Занчит ссылаемся и на то, что имя не может быть выражением.
Видимо, ты и сам понимаешь, что в этом и слабость твоей трактовки.
Я пытаюсь понять, как так выходит, что ты якобы придерживаешься стандарта, а именем называешь все что угодно. И не понимаю. Поэтому либо ты объясняешь как это, либо не ссылаемся. Все просто.
Я не отрицаю что моя трактовка не укладывается в стандарт. Однако и твоя туда не укладывается.
Где я утверждал что моя трактовка понятнее? Понятность - это вещь субъективная.
Я говорил, что она полнее, т.к. она легко объясняет оба случая, а твоя (как ты сам признался) только первый.
Ну так покажи где я не могу использовать ссылку, там же где и указатель, кроме этих двух случаев.
Указатель - это объект, к которому может быть применена операция разыменования, в результате которой получаем доступ к другому объекту, т.е. в общем случае - ссылку.
Отлично. Где это в стандарте написано, что мы получаем ссылку?
Ссылка - это такой незримый дух, который присутствует всюду. :D
Нет, улыбаюсь я твоей "фигне", которая описывает как ссылку, так и указатель. Что в моей "фигне" не верно по отношению к указателю?
Занчит ссылаемся и на то, что имя не может быть выражением.
А кто говорил обратное?
Я пытаюсь понять, как так выходит, что ты якобы придерживаешься стандарта, а именем называешь все что угодно. И не понимаю. Поэтому либо ты объясняешь как это, либо не ссылаемся. Все просто.
Я не отрицаю что моя трактовка не укладывается в стандарт. Однако и твоя туда не укладывается.
Ты тоже указателем называешь что угодно?
Ещё раз:
Для именнованной ссылки все укладывается лучше некуда.
Для неименнованной ссылки мы так же получаем доступ к объекту, как и при использовании имени. Имени нет, а доступ есть. Поэтому и говорю про альтернативное имя.
Где я утверждал что моя трактовка понятнее? Понятность - это вещь субъективная.
Я говорил, что она полнее, т.к. она легко объясняет оба случая, а твоя (как ты сам признался) только первый.
Да с чего она полнее?
Тем что она запутанно объясняет два случая, при этом вводя кучу других непонятных случаев?
Ну так покажи где я не могу использовать ссылку, там же где и указатель, кроме этих двух случаев.
int* p = 0;
int* p = addr;
p++;
p != NULL;
static_cast<char*>(p);
int i = (int)p;
и т.д.
и обратное:
const int &r = 5;
Отлично. Где это в стандарте написано, что мы получаем ссылку?
Ссылка - это такой незримый дух, который присутствует всюду. :D
Ссылка - способ доступа к объекту идентичный доступу по имени.
Разыменовывая указатель мы так же получаем доступ к объекту.
И это прописано в стандарте.
В общем случае доступ по ссылке не отличим от доступа по имени или через разыменование. Да вот такой "незримый дух", который позволяет оперировать с объектом. А "незримый" и "дух" потому, что само по себе объектом не является.
Нет, улыбаюсь я твоей "фигне", которая описывает как ссылку, так и указатель. Что в моей "фигне" не верно по отношению к указателю?
То, что через указатель можно получить доступ к объекту только через разыменование, а не напрямую, как в случае со ссылкой.
Ты отличаешь доступ к объекту по имени от доступа через указатель?
А доступ по имени от доступа через ссылку?
p->val;
r.val
Разницу видишь?
Так ты утверждаешь что альтернативное имя не противоречит стандарту.
Нет. Я использую термин неявный указатель только потому что ссылка сылает посредством адреса, так же как и указатель. Не более. Я это неоднократно писал.
Для именнованной ссылки все укладывается лучше некуда.
Так зачем нужны трактовки, которые объясняют лишь частные случаи?
Мы получаем доступ к объекту и при использовании указателя.
Потому что для нее нет разницы именованная ссылка или нет. Поэтому эта трактовка полнее и универасльнее.
Да где ж запутано? Я не ввожу новых свойств для ссылки. Что следует из того, что она ссылается посредством адреса?
Моя трактовка вводит только одно, что ссылка ссылается посредством адреса и все. Что дает мне право в рамках трактовки назвать ее неявным указателем. А не ссылка - это указатель, поэтому она ссылается посредством адреса. Разницу чувствуешь?
int* p = 0;
int* p = addr;
p != NULL;
static_cast<char*>(p);
int i = (int)p;
const int &r = 5;
Ну вот заменяю:
int& r = *(int*)0;
int& r = *addr;
&r != NULL;
static_cast<char*>(&r);
int i = (int)&r;
const int __i = 5;
const int* r = &__i;
Ты мне опять показываешь различия интерфейса, однако как это соотноситься с тем, что ссылку нельзя рассматривать как нечно хранящее адрес - не понятно.
Ну путь с натяжкой будет №3.
Разыменовывая указатель мы так же получаем доступ к объекту.
И это прописано в стандарте.
Так где там написано, что разыменование указателя возвращает ссылку?
Так как это противоречит тому, что сссылка сылается посредством адреса?
А как это противоречит тому, что было написано:
Указатель - способ доступа к объекту, схожий (идентичный) с доступом по имени.
Где тут про прямой, косвенный и пр?
Так ты утверждаешь что альтернативное имя не противоречит стандарту.
Именно так, не противоречит.
А где сказано, что ссылка ссылается посредством адреса?
Так зачем нужны трактовки, которые объясняют лишь частные случаи?
Потому что для нее нет разницы именованная ссылка или нет. Поэтому эта трактовка полнее и универасльнее.
Моя трактовка объясняет оба случая. Только в первом она полностью (без каких либо оговорок) соответствует стандартному определению имени. А во втором стоит оговорится.
Ты считаешь, что множество оговорок, сопутствующие твоей трактовке, повышают её полноту и универсальность?
Мы получаем доступ к объекту и при использовании указателя.
Только через операцию разыменования, а не напрямую.
Да где ж запутано? Я не ввожу новых свойств для ссылки. Что следует из того, что она ссылается посредством адреса?
Моя трактовка вводит только одно, что ссылка ссылается посредством адреса и все.
Да вот как раз адрес и запутывает. Адрес не при чем.
Есть и др. запутки, которые уже не раз обсуждались и на грабли которых ты наступаешь и в этом своем посте (см. ниже).
А не ссылка - это указатель, поэтому она ссылается посредством адреса. Разницу чувствуешь?
Я фразы то не понял, не то чтоб разницу почувствовать... :)
Переходим к граблям по которым ты со своей трактовкой ходишь:
Ну вот заменяю:
int& r = *(int*)0;
Это ill-formed, а мой пример well-formed.
Надеюсь, ты разницу понимаешь. Так что эта твоя "замена" просто... глупость.
int& r = *addr;
Мой пример показывал, как указатель инициализируется конкретным значением адреса. Здесь такой инициализации не вижу.
&r != NULL;
В моем примере проверялось значение указателя, не является ли оно null pointer-ом.
Выражение могло вернуть true или false.
В твоей "замене" берется адрес объекта (ссылка тут не при чем) и проверяется на null-pointer. Сравнение бессмысленное, т.к. всегда будет true.
static_cast<char*>(&r);
int i = (int)&r;
Опять же, при чем тут ссылка, если ты берешь указатель на объект?
const int __i = 5;
const int* r = &__i;
В моем примере была дополнительная переменная?!
Как ты собираешься вводить её в таком случае:
Не знаю, на что ты надеялся, "замена" не засчитана.
И еще такой примерчик:
какую альтернативу предложишь?
Ты мне опять показываешь различия интерфейса, однако как это соотноситься с тем, что ссылку нельзя рассматривать как нечно хранящее адрес - не понятно.
А при чем тут интерфейс? Ссылка просто не хранит адрес и все тут.
Так где там написано, что разыменование указателя возвращает ссылку?
Именно это не прописано, однако, что мне мешает так трактовать?
Мы же вроде бы о трактовках говорим?
Так как это противоречит тому, что сссылка сылается посредством адреса?
Да не нужен ей никакой адрес, чтоб ссылаться.
А как это противоречит тому, что было написано:
Указатель - способ доступа к объекту, схожий (идентичный) с доступом по имени.
Где тут про прямой, косвенный и пр?
"Идентичный - Полностью совпадающий или точно соответствующий чему-л.; тождественный."
Ты не видишь разницы между доступом по имени и по указателю?
Т.е. даже внешне никакой разницы?
ptr->val;
Кто тут считает, что ссылка это просто псевдоним?
Что ссылка не имеет размера, что ссылка не имеет своего адреса,
что ссылка не имеет значения? Ничего подобного, ссылка имеет и
размер, и свой адрес, и значение, равное адресу объекта на который
ссылается. Ссылка - это кастрированный указатель. У ссылки доступ к
к практически всем свойствам указателя заблокирован. Если вас не
пускают в элитный ресторан, то это не значит что там не кормят.
Небольшой пример, как получить размер ссылки, её адрес, и адрес который она хранит.
{
public:
A(){}
};
class B
{
public:
B(int i) : m(i){}
int m;
};
class C
{
public:
C(int *p) : m(p){}
int *m;
};
class D
{
public:
D(int &r) : m(r){}
int &m;
};
void main()
{
printf("sizeof(A) = %dn", sizeof(A));
printf("sizeof(B) = %dn", sizeof(B));
printf("sizeof(C) = %dn", sizeof(C));
printf("sizeof(D) = %dn", sizeof(D));
/*
имеем (64 бит, указатель имеет размер 8 байт)
sizeof(A) = 1
sizeof(B) = 4
sizeof(C) = 8
sizeof(D) = 8
Пустой класс имеет размер 1. Остальные имеют размер равный размеру переменной-члену.
Если ссылка не имеет размера, тогда какого рожна класс D имеет размер целых 8 байт?
*/
int i = 10;
B b(i);
C c(&i);
D d(i);
printf("i = %dn", i);
printf("b.m = %dn", b.m);
printf("*c.m = %dn", *c.m);
printf("d.m = %dn", d.m);
/*
имеем
i = 10
b.m = 10
*c.m = 10
d.m = 10
*/
i = 20;
printf("i = %dn", i);
printf("b.m = %dn", b.m);
printf("*c.m = %dn", *c.m);
printf("d.m = %dn", d.m);
/*
имеем
i = 20
b.m = 10
*c.m = 20
d.m = 20
*/
// трюк с указателем
int **ppi = reinterpret_cast<int**>(&c);
**ppi = 30;
printf("i = %dn", i);
printf("b.m = %dn", b.m);
printf("*c.m = %dn", *c.m);
printf("d.m = %dn", d.m);
/*
имеем
i = 30
b.m = 10
*c.m = 30
d.m = 30
Я взял адрес объекта c, который равен адресу его внутреннего указателя,
взял адрес, который храниться в указателе, и записал туда число,
фактически в переменную i.
*/
// трюк с ссылкой
ppi = reinterpret_cast<int**>(&d);
**ppi = 40;
printf("i = %dn", i);
printf("b.m = %dn", b.m);
printf("*c.m = %dn", *c.m);
printf("d.m = %dn", d.m);
/*
имеем
i = 40
b.m = 10
*c.m = 40
d.m = 40
Я взял адрес объекта d, который равен адресу его внутренней ссылки,
взял адрес, который храниться в ссылке, и записал туда число,
фактически в переменную i.
Если ссылка не имеет размера, не имеет адреса, и не содержит никакого адреса,
то как такое объяснить?
*/
}
Тему уже заездили до дыр. Ваш пост мне не понравился - вы делаете обобщение на понятие "ссылка", исходя из эксперимента над компилятором. Что есть ссылка с точки зрения C++ и ее реализация -- разные вещи. Если вы открыли, что в вашем компиляторе ссылки имеют определенные свойства (причем что в них от реализации, а что - языковое вы не можете разделить) и представлены как урезки указателей - так это только и всего. Если это даже во всех компиляторах так, то все-равно. Ссылка и реализация ее - разные вещи. Понятия языка вводятся директивно, а реализация должна удовлетворять этому, но имеет свободу во всем неоговоренном. Поэтому наше дело не экспериментировать в таких вещах, а учить матчасть. В любом случае, надо отдавать себе отчет в том, что в эксперименте присутствуют факторы реализации, которые надо уметь отделять.