ссылки и указатели
В чем принципиальная разница м\у ссылками и указателями, и когда ссылки использовать предпочтительнее:rolleyes:
См. 5.3.1:
Заметь "T", а не "reference to T" или "T&".
Вы путаете унарный оператор &(), унарный оператор*() и объявление ссылки - T &D и указателя соответсвенно T *D - отсюда и каша.
Стандарт 2003 года, глава 8 и в частности 8.3.2. - ссылки. Четвертая часть говорит достаточно четко - не может быть ссылки на ссылку, массива ссылок и указателя на ссылку. Достаточно странно для указателя - даже неявного, не правда ли?
По второму кругу одно и тоже?
Я писал что у указателя и неявного указателя абсолютно разное поведение. Вы все совершаете ошибку. С чего оно должно быть абсолютно схожим? Это уже плод вашего воображения.
Ты мне дай определение ссылки. Все как-то уклоняются от данного вопроса переводя тему на сравнение ссылки и указаетля. Я уже несколько раз писал почему я называю ссылку неявным указателем. Да, этот термин придумал я. Однако вы прицепились не к сути термина, а к названию. Я уже приводил пример с бритвой и "Бритвой Оккама".
С Green'ом мы уже выяснили что ссылку можно представить как псевдоним, но это не вся ее суть. Ссылка может существовать без имени как ссылки, так и объекта, на который она ссылается. Надеюсь пример приводить не нужно?
Адрес указателя ты можешь получить средствами языка, а адрес ссылки - нет.
Это вы путаете, разговор как раз идет об операторе разыменования *.
См. 5.3.1:
If the type of the expression is "pointer to T", the type of the result is "T".
Заметь "T", а не "reference to T" или "T&".
Ну чтож давай вернемся к стандарту, и именно к 5.3.1.1:
The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.
А теперь поднимаемся чуть выше и смотрим:
3.10.2
An lvalue refers to an object or function.
3.10.3
[Note: some built-in operators and function calls yield lvalues.
[Example: if E is an expression of pointer type, then *E is an lvalue expression referring to the object or function to which E points.
As another example, the function
int& f();
yields an lvalue, so the call f() is an lvalue expression. ]ъ
lvalue является ссылочным типом, т.е. lvalue ссылается на объект (3.10.2).
Операция разыменование указателя возвращает (хорошо, не неименнованную ссылку, а) ссылочный тип.
Неименованная ссылка - это и есть ссылочный тип в чистом виде.
Поэтому нет никакого противоречия:
т.к. указатель не предоставляет доступа к объекту (не ссылается на объект), доступ предоставляет ссылочный тип, который получается в результате разыменования указателя.
Я писал что у указателя и неявного указателя абсолютно разное поведение. Вы все совершаете ошибку. С чего оно должно быть абсолютно схожим? Это уже плод вашего воображения.
Да нет, это "неявный указатель" - плод твоего воображения.
Естествнно, все мы совершаем ошибку, это же твой "неявный указатель", вот ты им и крутишь, как хочешь.
Ты где нибудь в стандарте нашел упоминание об разыменовании "неявного указателя"? И вообще упоминание "разыменования" применительно к ссылкам?
Ты мне дай определение ссылки. Все как-то уклоняются от данного вопроса переводя тему на сравнение ссылки и указаетля. Я уже несколько раз писал почему я называю ссылку неявным указателем.
Но ты не разу не написал, что такоя "неявный указатель". Получается, что ссылка - это такая неявная хрень, которая почему то называется указателем, пусть и неявным.
Да, этот термин придумал я. Однако вы прицепились не к сути термина, а к названию.
Ну так название отржает суть, а если ещё и нет др.определения сути, то название - это единственное к чему можно апеллировать.
Ссылка может существовать без имени как ссылки, так и объекта, на который она ссылается.
Тогда это будет неименнованая ссылка. Делов то.
Адрес указателя ты можешь получить средствами языка, а адрес ссылки - нет.
Потому, что его нет. Смотри цитаты, которые я приводил выше.
А теперь поднимаемся чуть выше и смотрим:
lvalue является ссылочным типом, т.е. lvalue ссылается на объект (3.10.2).
Операция разыменование указателя возвращает (хорошо, не неименнованную ссылку, а) ссылочный тип.
Неименованная ссылка - это и есть ссылочный тип в чистом виде.
Ты уже выкручиваешся, твой перевод слишком вольный. Там написано что lvalue ссылается на объект или функцию (lvalue referring to the object or function), а не lvalue является ссылочным типом (lvalue is a reference type).
Ссылается != возвращает ссылку.
Если через указатель мы получаем доступ не к объекту на который он указывает, то к чему?
К чему я не могу получить доступ у объекта используя указатель на объект о вместо ссылки на него?
Естествнно, все мы совершаем ошибку, это же твой "неявный указатель", вот ты им и крутишь, как хочешь.
Но ты не разу не написал, что такоя "неявный указатель". Получается, что ссылка - это такая неявная хрень, которая почему то называется указателем, пусть и неявным.
Какое счастье мы ушли от сравнения указателя и ссылки. Наконец-то. :)
Я не ввожу новую сущность "неявный указатель". Я так называю ссылку. Ты путаешь причину и следствие моих расуждений.
А где я пишу что это есть в стандарте? Это лично мое виденье ссылок, вернее следствие из него.
Да, но суть пораждает название, а не название пораждает суть. Если конечно ты не сторноник радикального идеализма. :)
А что такое неименованная ссылка? Это очередной мистический "способ доступа к объекту"?
Его невозможно получить. :)
Получи мне адрес указателя, который возвращает вот эта функция :)
{
return 0;
}
Я не ввожу новую сущность "неявный указатель". Я так называю ссылку.
а...
т.е. твое определение "ссылка - это неявный указатель", значит "ссылка - это ссылка".
Отличное определение. :)
А где я пишу что это есть в стандарте? Это лично мое виденье ссылок, вернее следствие из него.
Ну так мы обсуждаем тут ссылки не с точки зрения твоего видения, а с т.з. языка C++, т.е. его стандарта.
А что такое неименованная ссылка? Это очередной мистический "способ доступа к объекту"?
Есть такая вещь, как неименованные объекты, т.е. объекты у которых нет имени.
Объект типа ссылка, не имеющтий имя, называется неименнованной ссылкой.
Его невозможно получить. :)
Получи мне адрес указателя, который возвращает вот эта функция :)
{
return 0;
}
Результатом выполнения этой функции является rvalue, поэтому нельзя получить указатель (адрес) на это возвращаемое значение.
Однак ссылка является lvalue, почему же я не могу получить её адрес?
Ссылается != возвращает ссылку.
Да бог с ним, сути дело это не меняет. lvalue - это так же не адрес.
Ссылка является lvalue, и её не надо "неявно разыменовываться", чтоб ссылаться на объект.
Если через указатель мы получаем доступ не к объекту на который он указывает, то к чему?
К чему я не могу получить доступ у объекта используя указатель на объект о вместо ссылки на него?
Ты неверно задаешь вопрос. Не "к чему", а "как".
Доступ мы получаем (к чему?) к объекту, на который указатель указывает, но только (как?) при разыменовании,- операции, которая вернет lvalue (5.3.1.1).
Я, кстати, нашел отличное определение ссылки:
http://www.umsl.edu/~subramaniana/overload1.html
Lvalues allow a variable to be changed. To change a variable you need its lvalue. A reference variable is a lvalue of another variable
т.е. твое определение "ссылка - это неявный указатель", значит "ссылка - это ссылка".
Отличное определение. :)
Ты опять не внимателен. Это не определение ссылки. Это один из способов ее представления. И как я считаю, наиболее полный.
Мы обсуждаем что ж такое ссылка. Пока определения ссылки по стандарту C++ я не увидел. По-моему его там и нет.
Объект типа ссылка, не имеющтий имя, называется неименнованной ссылкой.
Это понятно. Но мы же говорим о сути ссылки, а не о вариантах ее названия. Или ссылка и неименованная ссылка это две разных сущности? :)
Так, давай определимся мы можем или не можем получить адрес указателя. :)
Так решил Страуструп. Не можешь и не можешь.
Ссылка является lvalue, и её не надо "неявно разыменовываться", чтоб ссылаться на объект.
lvalue это не только ссылка. Ссылка лишь частный случай lvalue. lvalue это часть синтаксиса конструкций C++, а не тип.
Доступ мы получаем (к чему?) к объекту, на который указатель указывает, но только (как?) при разыменовании,- операции, которая вернет lvalue (5.3.1.1).
Не уводи в дебри. Через указатель мы можем получить доступ к объекту (ты с этим не споришь) и не важно с разыменованием или нет. Поэтому указатель, так же как и ссылка, является "способом доступа к объекту". Так что нужно искать другое определение ссыки вместо "способ доступа к объекту". :)
http://www.umsl.edu/~subramaniana/overload1.html
Молодец. Долго искал, наверное.
А где вот тут другая переменная?
Или вот тут:
{
return *(new char);
}
func() = 'A';
Действительно невнимательный, не заметил, что ты требуешь от нас предоставить четкого определения, отметая все предложенные варианты, а сам так и не привел ни одного определения.
Тогда, в первую очередь, приведи определение ссылки.
Что значит "один из способов представления" ? Один из способов реализации?
Мы обсуждаем что ж такое ссылка. Пока определения ссылки по стандарту C++ я не увидел. По-моему его там и нет.
Смотри 8.3.2. Обрати там внимание на интересное предложение:
Note: a reference can be thought of as a name of an object.
Допустим определение в стандарте не достаточно четкое, тогда будем говорить, что мы обсуждаем ссылки с общепринятой т.з.
И тебе ни раз уже приводились эта общепринятая т.з. в виде цитат из различных источников. Вот ещё один: http://www.glenmccl.com/glos.htm#tag197
Ты же предлагаешь нам обсуждать ссылку с твоей т.з., отметая при этом общепринятую.
Я сразу предупреждаю: я не собираюсь обсуждать ссылки с твоей т.з., так как она ошибочна.
Так, давай определимся мы можем или не можем получить адрес указателя. :)
Мы можем получить адрес lvalue. Если объект "указатель" является lvalue, мы можем получить адрес этого объекта.
lvalue это не только ссылка. Ссылка лишь частный случай lvalue. lvalue это часть синтаксиса конструкций C++, а не тип.
Да, но ссылка всегда lvalue, причем не совой собственный lvalue, а другого объекта.
Так что нужно искать другое определение ссыки вместо "способ доступа к объекту". :)
Другое определение.
Ах да, оно тебя не устроила, т.к. не попадпет под твое "наиболее полное представление".
Молодец. Долго искал, наверное.
А где вот тут другая переменная?
Или вот тут:
{
return *(new char);
}
func() = 'A';
Объект, указатель на который возвращает оператор new.
Я согласен, что слово "переменная" вносит некоторое смущение, хотя от этого определение не становиться неверным, т.к.
variable - an object that can be assigned to.
Переме́нная в традиционных (императивных) языках программирования — поименованная либо адресуемая иным способом область памяти, имя или адрес которой можно использовать для осуществления доступа к данным, находящимся в переменной (по данному адресу).
Чтоб не смущаться, давай заменим слово "переменная" на слово "объект":
A reference object is a lvalue of another object.
P.S. Прежде, чем продолжать, приведи свое определение ссылки, а так же подкрепи его внешними источниками.
Тогда, в первую очередь, приведи определение ссылки.
См. ниже.
Ссылку можно представить как псевдоним, а можно как неявный указатель.
А реализация ссылки (когда она не удаляется оптимизатром) не возможна без прменения тех же механизмов, что и при реализации указателя (хранения адреса). Считаешь по другому - приведи пример.
Обрати внимание на выделенное.
О ссылке можно думать как об имени объекта.
Однако это не определение ссылки, это одно из ее возможных представлений.
Как ты изворачиваешься. Первоисточник стандарт - остальное это личное мнение автора. Стандарт описывает только поведение ссылки, а понимание оставляет на совесть программиста и каждый понимает их по своему. Ведь даже ты привел кучу вариантов как можно представлять себе ссылку. Если тебе твоя религия не позволяет использовать понятие адреса применительно к ссылке, то это твое мнение. Однако, ты выставляшь это тут как абсолютную истину.
Ты же предлагаешь нам обсуждать ссылку с твоей т.з., отметая при этом общепринятую.
Опять там фигурирует имя. Ссылки могу существовать вообще без имен, я кажется это уже несколько раз показал.
А где я могу увидеть общпринятое понятие ссылки? Ты его не представил, а все что представлял содержат неточности или слишком расплывчаты, чтобы быть применены только к ссылке, что я и показал.
Я понял, ты носитель абсолютного знания. :)
Ты можешь получить адрес объекта на который ссылается lvalue, а не адрес lvalue. Не говори глупостей. lvalue часть синтаксиса, а не сущность в программе на C++.
У объекта нет lvalue. Ты пишешь бред.
Объект в программе и часть синтаксиса надеюсь ты раличаешь?
Вот например:
Здесь 'func()' - lvalue. А ссылка это объект, который возвращает функция func.
Ах да, оно тебя не устроила, т.к. не попадпет под твое "наиболее полное представление".
Это определение применимо так же к указателю. Будешь спорить?
Т.е. объект, который идентифицируется по адресу, хранящемуся в указателе. Правильно?
Чтоб не смущаться, давай заменим слово "переменная" на слово "объект":
Ссылка - это lvalue дргого объекта?
Повторюсь у объекта нет lvalue. Объект это один из возможных варинтов lvalue. lvalue - это часть синтаксиса, которая входит в более широкую еденицу синтаксиса - expression.
Ты же не говоришь, что * это объект, посредством которого мы разыменовываем другие объекты.
Насчет источников читай выше.
Я тебе не приведу определения ссылки, потому что его не существует (даже в стандарте). Существуют только лишь представления. Вот мое:
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту. Механизм доступа к объекту через ссылку похож на механизм доступа к объекту через указатель, за исключением того, указатель нужно разыменовывать, а ссылку нет. Поэтому ссылку можно представлять как неявно разыменовываемый указатель, или неявный указатель.
Принципиальное отличие ссылки от указателя только в автоматическом получении адреса объекта, которым мы иницируем ссылку, и отсутсвие операции разыменования * (indirection) при обращении к объекту.
Теперь ты дай свое. Только давай без имен и lvalue.
И еще, объясни мне почему люди, не способные дать определения ссылке без неточностей, считают себя авторитетными в данном вопросе?
Ты можешь получить адрес объекта на который ссылается lvalue, а не адрес lvalue. Не говори глупостей. lvalue часть синтаксиса, а не сущность в программе на C++.
У объекта нет lvalue. Ты пишешь бред.
Да, согласен, намудрил. Исправляюсь:
"... ссылка всегда lvalue, причем всегда ссылающееся на уже существующий объект."
А реализация ссылки (когда она не удаляется оптимизатром) не возможна без прменения тех же механизмов, что и при реализации указателя (хранения адреса).
Вот здесь ты начинаешь изворачиваться.
Что значит "удаляется оптимизатором" ?
Компиляция с ключом оптимизации - это уже не компиляция C++ ?
Это всего-лишь по-другому реализованная компиляция.
В результате получается другая реализация исполняемого кода.
Об этом неоднократно и говорилось: "Many compilers will implement references as pointers, especially if debugging is enabled, but that's an implementation issue."
Где ссылка хранит адрес?
Если хранит, то ссылка ОБЯЗАТЕЛЬНО требует какой-то памяти, а это противоречит стандарту, где ясно сказано, что это не обязательно.
Если тебе твоя религия не позволяет использовать понятие адреса применительно к ссылке, то это твое мнение. Однако, ты выставляшь это тут как абсолютную истину.
Я выставляю это не как абсолютную истину, а как общепринятое мнение. Для чего и привожу множество цитат.
А где я могу увидеть общпринятое понятие ссылки? Ты его не представил, а все что представлял содержат неточности или слишком расплывчаты, чтобы быть применены только к ссылке, что я и показал.
Общепринятое понятие представлены выше многообразием цитат.
Если бы они были абсолютны, то были бы определением, а так это понятия (трактовки).
Т.е. объект, который идентифицируется по адресу, хранящемуся в указателе. Правильно?
Объект, который расположен в памяти по адресу...
Значением указателя является адрес (первого байта) этого объекта.
Насчет источников читай выше.
Э... что читать то?
Ссылку можно представить как псевдоним, а можно как неявный указатель.
Я тебе не приведу определения ссылки, потому что его не существует (даже в стандарте). Существуют только лишь представления. Вот мое:
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту. Механизм доступа к объекту через ссылку похож на механизм доступа к объекту через указатель, за исключением того, указатель нужно разыменовывать, а ссылку нет. Поэтому ссылку можно представлять как неявно разыменовываемый указатель, или неявный указатель.
Принципиальное отличие ссылки от указателя только в автоматическом получении адреса объекта, которым мы иницируем ссылку, и отсутсвие операции разыменования * (indirection) при обращении к объекту.
Ок, определения не существует.
Сойдемся на том, что мы имеем две трактовки: твое и общепринятое.
(Слово "представление" вносит некоторую путаницу с "реализацией", поэтому использую "трактовка" или "истолкование").
Чем мне не нравится твоя трактовка:
1. Ссылка ссылается не на адрес, а на объект, а уж объект расположен по адресу.
2. И уж тем более не программист задает (определяет) этот адрес.
3. Ссылка - не объект ! Я немного колебался в начале между "не объектом" и "неполноценным объектом", теперь утверждаю четко:
4. Ссылка является специфичным типом, это не объектный тип, коим является указатель.
5. Отсюда принципиальное отличие ссылки от указателя - это то, что указатель является объектом, а ссылка - нет, о чем четко написано в стандарте. Отсюда и вытекают основные различия.
6. А различий между ссылкой и указателем слишком много, а общее только одно - с помощью и того и др. можно обратиться к объекту. И то, для обращения по указателю, надо применить оператор разыменования, т.е. он ссылается на объект не на прямую а косвенно.
Т.о. трактовка ссылки через указатель вводит в заблуждение, о чем так же приводил неоднократные цитаты.
Ещё одна:
From a language perspective, the following is true: A reference is not a pointer. A pointer is not a reference. End of story. Anyone who tries to explain a reference in terms of a pointer, or pointers in terms of a reference is only going to confuse people in the long run.
Теперь ты дай свое. Только давай без имен и lvalue.
Нет уж извини, я же не требовал от тебя не использовать слова "указатель" и "адрес". Может мне ещё и согласные буквы не использовать для описания МОЕЙ трактовки?
Общепринятая трактовка в моей интерпретации:
Ссылка может расцениваться как альтернативное имя объекта. Выражения представляющие (имеющие тип) ссылки сначала приводятся к типу объекта на которые ссылаются, а уж дальше производятся все необходимые операции.
Рассматривая ссылку, как альтернативное имя объекта, очевидно, что ссылка всегда связана с объектом. При этом ссылка не может быть изменена на связь с другим объектом.
Ссылка не является объектом, и поэтому не хранит каких либо значений, а сл-но может не располагаться в памяти. Поэтому же на неё нельзя получить указатель или ссылку, и невозможно создать с помощью выражения new (new-expression).
Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку.
И еще, объясни мне почему люди, не способные дать определения ссылке без неточностей, считают себя авторитетными в данном вопросе?
А они не дают определения, как мы уже выяснили, - а трактовку.
"... ссылка всегда lvalue, причем всегда ссылающееся на уже существующий объект."
Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой. А разыменование указателя тоже всегда lvalue.
Что значит "удаляется оптимизатором" ?
Компиляция с ключом оптимизации - это уже не компиляция C++ ?
Это всего-лишь по-другому реализованная компиляция.
В результате получается другая реализация исполняемого кода.
Об этом неоднократно и говорилось: "Many compilers will implement references as pointers, especially if debugging is enabled, but that's an implementation issue."
Потому что оптимизация может удалить и указатель, указывающий на объект и вспомогательные объекты. Например, как думаешь какой код будет сгенерирован компилятором с включенной оптимизацией для данного код:
{
int j = 1;
int i = j;
int* p = &i;
*p = 2;
return i;
}
Что ж нам теперь не считать j и p объектами?
Если хранит, то ссылка ОБЯЗАТЕЛЬНО требует какой-то памяти, а это противоречит стандарту, где ясно сказано, что это не обязательно.
Для начала было бы неплохо привести где в стандарте это написано. И где написано, что объект обязательно требует памяти.
Там где она определена, там и хранит. Так же как и объекты.
И еще: Если объект требует памяти, значит он расположен в этой памяти, и значит, если ссылка всегда ссылается на объект, то ссылка всегда ссылается на объект в памяти. А это ты пытался опровергнуть в одном из своих сообщений. Нестыковочка. :)
Кем же принято это "общепринятое мнение"? Судьи кто?
Если бы они были абсолютны, то были бы определением, а так это понятия (трактовки).
Т.е. каждый имеет право на свою трактовку?
Значением указателя является адрес (первого байта) этого объекта.
Т.е. ссылка идентифицирует объект в данном примере по адресу. Так?
Что это личное мнение автора. Не более.
Наконец, мы это выяснили.
Сойдемся на 3-х, т.к. общепринятых трактовок ты приводил 2 принципиально разных:
1) Другое имя
2) lvalue другого объекта
Поэтому имеет смысл говорить о 3-х трактовках. Осталось выяснить какая из двух тобой приведенных "общепринятая".
1. Ссылка ссылается не на адрес, а на объект, а уж объект расположен по адресу.
Указатель указывает на объект, а объект расположен по адресу.
Да?
char& c = x; // тут я беру адрес другого объекта (я определяю что мне нужен адрес x)
char& c = *(&x + rand()); // да хоть так
4. Ссылка является специфичным типом, это не объектный тип, коим является указатель.
Ссылка является специфичным указателем, почему от этого она должна стать объектом?
Цель у них одна, это альтернативный способ доступа к объекту. Это и есть суть этих сущностей. А остальное - отличие в интерфейсе.
Слишком много для кого? А судьи кто?
Да какая разница, напрямую или косвенно - цель одна. Просто у указателя больше возможностей, однако иногда пользоваться ссылкой удобнее.
Кого вводит в заблуждение?
Это заблуждение, что трактовка ссылки как указателя кого-то вводит в заблуждение. :)
Какие последствия могут быть, если я рассматриваю ссылку как указатель с другим интерфейсом, если я прекрасно знаю что можно делать с ссылкой, а что нельзя?
Чем дальше, тем больше религии в рассуждениях я вижу.
Это не определение. Это догма, очень слабо подкрепленная. :)
Конечно не требовал. Ведь я утверждаю что ссылку невозможно полно определить без понятия адреса. Ведь, объект на который ссылается ссылка всегда имеет адрес (существует указатель), но не всегда имя.
Ссылку без имени я тебе уже показывал. То же касается и lvalue.
Ссылка может расцениваться как альтернативное имя объекта. Выражения представляющие (имеющие тип) ссылки сначала приводятся к типу объекта на которые ссылаются, а уж дальше производятся все необходимые операции.
В принципе согласен, однако не совсем понятно что там приводится к типу (но это не суть важно). Однако, ключевая фраза, на мой взгляд, выделена жирным.
Ссылка - это read-only сущность. Делов-то.
Почему только объект может хранить какие-то значения? Почему я не могу понимать ссылку как нечто, хранящее значение?
Любой объект так же может не распологаться в памяти. См. пример выше.
Вывод: '*p' или '*func()' или др. - это так же альтернативное имя объекта. Что еще раз подтверждает, что ссылка и указатель не имеют принципиальной разницы, кроме того что ссылку не нужно разыменовывать.
И я неоднократно показал неточность этих трактовок. Ты можешь показать неверность моей трактовки. Но ты-то утверждаешь, что твоя трактовка самая верная, а моя - вовсе не верная, вздорная и вводит в заблуждение.
Повторюсь: Что пострадает, если я буду думать о ссылке как о "странном указателе", и если я знаю как его можно применять, а как нельзя? Тем более, если в большинстве реализаций (а я думаю что вообще во всех) она реализована как указатель.
ЗЫ. По-моему, давно пора перенсти тему в "Общалку".
Да ничего не будет. Просто некорректно называть ссылку вообще указателем(пускай даже и неявным:)), потому что указатель - полноценный объект и храниться в памяти, указывая при этом на какой-то др. объект. Это ж было уже сказано 1000 раз! А ссылка не имеет физической сущности - это всего лишь способ доступа к объекту. Т.е. ссылка нигде не храниться!
Если 0 - это null pointer constant, а я не знаю, где это не так, то вся запись - это ill-formed programm.
Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой.
lvalue - это и есть выражение, а не его результат.
А разыменование указателя тоже всегда lvalue.
Во-первых, не всегда, иногда это UB.
Во-вторых, как сам говоришь, не "указатель", а "разыменование указателя". Т.е. совсем иное выражение.
Потому что оптимизация может удалить и указатель, указывающий на объект и вспомогательные объекты.
Я могу показать, когда при прочих равных ссылки в объектнике не будет, а указатель будет.
Что ж нам теперь не считать j и p объектами?
Объектами? Ты считаешь ссылку объектом, потому, что она в некоторых реализациях аллоцируется в памяти процесса?
На основании этого ты не считаешь объектами, то, что не аллоцируется в памяти процесса?
Память процесса - это реализация, а мы говори об объектах с т.з. языка программирования.
Для начала было бы неплохо привести где в стандарте это написано.
п.8.3.5/3
И где написано, что объект обязательно требует памяти.
п.1.8, 3.7
Там где она определена, там и хранит. Так же как и объекты.
Ссылка ничего не хранит, т.к. не является объектом.
И еще: Если объект требует памяти, значит он расположен в этой памяти, и значит, если ссылка всегда ссылается на объект, то ссылка всегда ссылается на объект в памяти. А это ты пытался опровергнуть в одном из своих сообщений. Нестыковочка. :)
Т.е. ссылка идентифицирует объект в данном примере по адресу. Так?
Не играй в слова. Я утверждал и утверждаю, что ссылка ссылается на объект, а не на адрес в памяти или на область памяти. Ссылка не хранит (и не может хранить) значений, в т.ч. значение адреса.
Кем же принято это "общепринятое мнение"? Судьи кто?
Т.е. каждый имеет право на свою трактовку?
Что это личное мнение автора. Не более.
Сойдемся на 3-х, т.к. общепринятых трактовок ты приводил 2 принципиально разных:
1) Другое имя
2) lvalue другого объекта
Поэтому имеет смысл говорить о 3-х трактовках. Осталось выяснить какая из двух тобой приведенных "общепринятая".
2) lvalue - ссылающееся на др. объект
но это не трактовка это следствие из пунктов стандарта:
1) ссылка - это lvalue
2) lvalue ссылается на объект
А так, как это в точности соответствует имени, то ссылку можно трактовать, как имя (альтернативное).
Указатель указывает на объект, а объект расположен по адресу.
Ссылка ссылается на объект не по средством адреса этого объекта, а указатель как раз-таки посредством адреса.
Да?
char& c = x; // тут я беру адрес другого объекта (я определяю что мне нужен адрес x)
char& c = *(&x + rand()); // да хоть так
Вот собственно, чем и плоха твоя трактовка.
Не беруться адреса в этих примерах. Этого ты как раз понять и не можешь.
Устанавливается связь между объектом и именем (ссылкой), но никакие адреса не беруться и нигде не сохраняются, как в случае с указателем.
Ты же не говоришь, что здесь:
char c = 0;
берется адрес.
Ссылка является специфичным указателем, почему от этого она должна стать объектом?
Потому, что указатель - объект, это его основное свойство. Если "специфичный указатель" - не объект, значит его уже нелогично называть указателем.
Цель у них одна, это альтернативный способ доступа к объекту. Это и есть суть этих сущностей. А остальное - отличие в интерфейсе.
Цель у них не одна, хотя бы потому, что над указателем можно производить операции.
У них есть одна единственная схожая цель - ссылаться напрямую или косвенно на объект.
Про отличия будем опять повторяться? У них большое количество отличий.
Слишком много для кого? А судьи кто?
Слишком много по сравнению со сходностью.
Да какая разница, напрямую или косвенно - цель одна. Просто у указателя больше возможностей, однако иногда пользоваться ссылкой удобнее.
Иногда ссылкой воспрользоваться невозможно, там где можно воспользоваться указателем.
Кого вводит в заблуждение?
Это заблуждение, что трактовка ссылки как указателя кого-то вводит в заблуждение. :)
Ну к примеру - тебя, смотри выше свои примеры с адресами.
Какие последствия могут быть, если я рассматриваю ссылку как указатель с другим интерфейсом, если я прекрасно знаю что можно делать с ссылкой, а что нельзя?
Ну во-первых, я сомневаюсь, что ты "прекрасно знаешь" что можно делать, а что нет. Тебе все же придется обратиться к справочной литературе, чтоб уточнить некоторые нюансы использования ссылок.
Ссылки в некоторых (и не так уж малочисленных случаях) ведут себя не так, как указатели, поэтому они и выделены в отдельный класс типов (reference type). А рассмотрение их, как указатели (object type), может привести к некоторой путанице.
Для деталей, пройдись по стандарту поисковым запросом "reference type" и посмотри на множество уточнений для этого типа.
Конечно не требовал. Ведь я утверждаю что ссылку невозможно полно определить без понятия адреса. Ведь, объект на который ссылается ссылка всегда имеет адрес (существует указатель), но не всегда имя.
Ссылку без имени я тебе уже показывал. То же касается и lvalue.
э... что касается lvalue ? Ты можешь показать ссылку не являющуюся lvalue ? :D
Ну так и ссылку без адреса тебе показывали.
Почему только объект может хранить какие-то значения? Почему я не могу понимать ссылку как нечто, хранящее значение?
Любой объект так же может не распологаться в памяти. См. пример выше.
Любой объект располагается в памяти по определению (см. п. стандарт перечисленные выше).
Ссылку нельзя понимать как нечто хранящее что-то, т.к. она объектом не является и может вовсе не располагаться где-бы то ни было.
Вывод: '*p' или '*func()' или др. - это так же альтернативное имя объекта. Что еще раз подтверждает, что ссылка и указатель не имеют принципиальной разницы, кроме того что ссылку не нужно разыменовывать.
"Лопать кашу" и "каша" - это не одно и тоже.
Повторюсь: Что пострадает, если я буду думать о ссылке как о "странном указателе", и если я знаю как его можно применять, а как нельзя? Тем более, если в большинстве реализаций (а я думаю что вообще во всех) она реализована как указатель.
Ты вполне можешь напороться на ситуацию, когда ссылка ведет себя не как указатель.
Если рассматривать ссылку, как указатель, то замена ссылки на указатель (конечно с добавлением разыменования) или наоборот так же может привести к проблемам.
Ко многим и очень неявным проблемам. Я даже не могу перебрать сейчас перебрать все нюансы такого рефакторинга.
В том то и проблема, что Nixus вроде бы как соглашается, что ссылка - не объект, но при этом считает, что она что-то хранит.
На что тут ссылается ссылка?
Ты наверное невнимательно прочитал:
Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой.
Или ссылка не может быть результатом выражения?
См. 5.3.1. что возвращает оператор разыменования (indirection).
Дык. Я как раз и показываю что принципиальной разницы между (*p) и r - нет. Не между p и r, а между (*p) и r.
Покажи.
Вообще, любую сущность можно назвать объектом. Другое дело, что в терминах C++ ссылка отделена от объекта. Я считаю что о ссылке можно думать как об объекте.
Я то считаю. Ты забыл о чем разговор в этом отрывке, наверное. Ты спросил почему я выделил оптимизацию - я показал примером когда оптимизация делает не существующим указатель. Тем же самым образом компилятор может сделать несуществующей и ссылку.
Мы говорим о трактовке.
но это не трактовка это следствие из пунктов стандарта:
1) ссылка - это lvalue
2) lvalue ссылается на объект
А так, как это в точности соответствует имени, то ссылку можно трактовать, как имя (альтернативное).
'func()' - это альтернативное имя?
А посредством чего ссылается ссылка на объект, особенно, если единственная информация о том как идентифицировать объект - это адрес?
Не беруться адреса в этих примерах. Этого ты как раз понять и не можешь.
Устанавливается связь между объектом и именем (ссылкой), но никакие адреса не беруться и нигде не сохраняются, как в случае с указателем.
Понимаешь в чем проблема, любой существующий объект идентифицируется адресом, а вот именем не все. Если бы все ссылки можно было идентифицировать именем, то тогда моя версия была бы бредом. А т.к. существуют безымянные объекты и ссылки, сопоставление ссылки и имени режет слух (глаз).
Я понимаю что такое взять адрес и в последующем на него ссылатся, а что такое происходит вот тут:
func() = 10;
с твоей точки зрения, я не понимаю.
char c = 0;
берется адрес.
А где тут ссылка?
И то и другое это сущность программы посредством которых осуществляется доступ к объекту.
Это все равно что: void*, в отличае от char*, это не указатель, т.к. мы не можем его семантически верно его разыменовать.
У них есть одна единственная схожая цель - ссылаться напрямую или косвенно на объект.
Так это и есть главная цель. Остальное ньюансы использования.
Дык. Интерфейс-то разный. :)
Кто решает какой критерий приоритетнее (качественее)? Или количество привольвирует над качеством?
И наоборот. Это два интсрумента со одним смыслом, но разными возможностями - читай интерфейсом.
Тебе все же придется обратиться к справочной литературе, чтоб уточнить некоторые нюансы использования ссылок.
Да, а с твоим объяснением все понятно и без литературы. :)
Ведут - читай интерфейс. А суть от этого не меняется, это опосредованный доступ к объекту.
Да какой путанице?
Если я буду рассматривать ссылку как другое имя, то как я смогу понять что тут делается?
func() = 10;
Тут нет имени ссылки, а есть то что возвращает функция, и это вносит логическую ошибку. Или мы теперь вызов функции будем именем называть?
Не могу, любое выражение в результате которого возвращается ссылка, может стоять слева от знака '='.
Так же как и любое выражение, которое возращает указатель можно разыменовать и поставить слева от знака '='. Однако это не говорит о его семантической верности. К примеру, разыменование void* не имеет смысла. По той же причине void& не имеет смысла. Кстати, еще одна общая черта. :)
Да не показывали. Все что ты показывал там везде есть адрес. См. ниже свое противоречие.
Да не играю я в слова. Я хочу выяснить принципиальный момент. Ты забыл наверное, напомню:
[QUOTE=Green]
[QUOTE=Nixus]Вот покажи мне ссылку, которая ссылается не на объект в памяти.
Да уж раза три показывал:
const int& r = 5;[/QUOTE]
Это было тут.
Однако ты написал:
Так куда ссылается ссылка r? Никак на объект в памяти.
Вывод: Любая ссылка ссылается на объект в памяти. Это верно или нет?
"Каша в кастрюле" и "каша в тарелке" - это одна и тоже, просто чтобы съесть "кашу в кастрюле" придется открыть кастрюлю.
Если рассматривать ссылку, как указатель, то замена ссылки на указатель (конечно с добавлением разыменования) или наоборот так же может привести к проблемам.
Ко многим и очень неявным проблемам. Я даже не могу перебрать сейчас перебрать все нюансы такого рефакторинга.
Все эти различия на уровне разности поведения (интерфейса), а суть не меняется. Но примеры все равно интересно увидеть.
Ч.т.д.
Вот скажи почему ты выбрал главным критерием отличия - физическую сущность (хотя термин очень и очень спорный)?
И сам выбрал или прочитал в какой-то книге?
На что тут ссылается ссылка?
На объект типа char. Да, ты не ослышался - объект типа char.
Интересно, а на что по-твоему? :)
См. 5.3.1. что возвращает оператор разыменования (indirection).
Ты сначала прочти 1.9, 4.10 и 8.3.2 прежде, чем спорить.
Дык. Я как раз и показываю что принципиальной разницы между (*p) и r - нет. Не между p и r, а между (*p) и r.
Ну тогда нет принципиальной разницы и между r и it->func().()[5].
Покажи.
int& volatile ri = a;
ri = 5;
int* volatile p = &a;
*p = 5;
f(ri);
f(*p);
Вообще, любую сущность можно назвать объектом. Другое дело, что в терминах C++ ссылка отделена от объекта. Я считаю что о ссылке можно думать как об объекте.
Да ты вообще можешь думать о ней, что угодно. Твои мысли ей не мешают. :)
'func()' - это альтернативное имя?
Почему бы нет. Я же уже говорил:
"Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку."
Обратного пока доказано не было.
А посредством чего ссылается ссылка на объект, особенно, если единственная информация о том как идентифицировать объект - это адрес?
А по средством чего ссылается имя на объект?
Понимаешь в чем проблема, любой существующий объект идентифицируется адресом, а вот именем не все. Если бы все ссылки можно было идентифицировать именем, то тогда моя версия была бы бредом. А т.к. существуют безымянные объекты и ссылки, сопоставление ссылки и имени режет слух (глаз).
Понимаешь, в чем проблема,- ты не умеешь абстрагироваться от "железа", а мыслишь только реализацией.
А слух и глаз из присутствующих режет почему-то только у тебя.
[QUOTE=Green]
Ты же не говоришь, что здесь:
char c = 0;
берется адрес.
А где тут ссылка?
[/QUOTE]
Здесь имя и оно, как ни странно, ссылается на объект. Так что, тут тоже берется адрес?
И то и другое это сущность программы посредством которых осуществляется доступ к объекту.
Ну так и имя - тоже сущность и тоже ссылается. Имя тоже указатель?
Это все равно что: void*, в отличае от char*, это не указатель, т.к. мы не можем его семантически верно его разыменовать.
Где сказано, что void* - не указатель?
Так это и есть главная цель. Остальное ньюансы использования.
Если цель автомобиля и самолета одинаковая (транспортировать), то это не говорит о том, что самолет - это автомобиль, или автомобиль - это самолет. Их объединяет то, что и то и другое - транспорт.
Так вот ссылка - не указатель, а указатель - не ссылка, но с помощью обоих можно получить (напрямую или косвенно) доступ к объекту.
Кто решает какой критерий приоритетнее (качественее)? Или количество привольвирует над качеством?
В таком случае, почему ты настаиваешь, что "Так это и есть главная цель. Остальное ньюансы использования." ?
И наоборот. Это два интсрумента со одним смыслом, но разными возможностями - читай интерфейсом.
Соглашусь, что это ДВА инструмента, с "одним смыслом" не соглашусь.
К примеру, разыменование void* не имеет смысла. По той же причине void& не имеет смысла. Кстати, еще одна общая черта. :)
"разыменование void* не имеет смысла", void& не может существовать.
Это ещё одно различие, производное из того, что указатель - объект, а ссылка - нет.
Так куда ссылается ссылка r? Никак на объект в памяти.
Вывод: Любая ссылка ссылается на объект в памяти. Это верно или нет?
Да согласен слегка намудрил.
Но опять же как ещё одно отличие от указателей.
Инициализация ссылки может создавать объект, причем в этом случае время жизни объект определяется временем жизни ссылки.
С указателями такого не бывает. Инициализация указателя не может создавать объекты, и время жизни указателя всегда не влияет на время жизни объекта.
Видишь, ещё один интересный нюанс откопали.
Так вот ссылка - не указатель, а указатель - не ссылка, но с помощью обоих можно получить (напрямую или косвенно) доступ к объекту.
Ты забываешь откуда взялся указатель в моих рассуждениях. Я утверждаю что все возможности ссылки невозможно определить без утверждения что ссылка сылается на адрес (объект по адресу, через адрес). Адрес роднит ссылку и указатель.
А теперь вспомни что тебе не понравилось:
Ссылка - это псевдоним, поэтому разговор об адресе в данном контексте неправильный.
После этого я назвал ссылку неявным указателем, т.к. в C++ нет других объектов, которые опреруют адресами, кроме указателей. Суть не в указателе, а в адресе объекта, без которого, по-моему, ссылка невозможна во всех ее свойствах в C++.
Пока мы выяснили, что ссылка сылается только на объекты, у которых есть адрес. Что является лишним аргументом в пользу.
Можно рассматривать имя как синоним адреса. А можно и не рассматривать.
У каждого объекта, у которого есть имя, есть и адрес. Но не у каждого объекта у которого есть адрес, есть имя.
Ссылка всегда ссылается на объект у которго есть адрес, ведь мы выяснили, что ссылка всегда ссылается на объект в памяти.
Ссылка может ссылаться как на объекты у которых есть имя, так и на объекты, у которых имени нет. Однако, оба эти объекта имеют адрес. Поэтому представление ссылки через имя - верно не для всех случаев, а через адрес, как ни странно, верно для всех случаев.
Интересно, а на что по-твоему? :)
И это все что мы знаем об объекте на который ссылается ссылка, только тип? Тогда я могу считать что обе ссылки тут ссылаются на один и тот же объект?
char& c2 = *(char*)malloc(10);
Ну ты же утверждаешь, что func() - это имя. Получается что нет принципиальной разницы между r и func(), то почему должна быть разница между r и it->func().()[5], и тем более r и *p?
int& volatile ri = a;
ri = 5;
int* volatile p = &a;
*p = 5;
f(ri);
f(*p);
Другой компилятор возьмет и не скомпилирует. Пример эксплуатирует толерантность компилятора, а не принципиальные отличия.
Да вот в том-то и дело, что могу, но некоторые почему-то возмущаются.
"Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку."
Обратного пока доказано не было.
Пока ты предполагаешь, т.е. ты еще не определился? Подождем пока определишся? А то спор какой-то бессмысленный, если ты не определился со своей позицией.
Вот смотри:
{
return *(new int);
}
func() = 0;
func() = 1;
...
Употребляем одно и то же имя 'func()', но каждый раз ссылаемся на разные объекты, как же так! Имя func() меняет объект, на который ссылается!
Можно считать что посредством адреса.
Откуда же тебе знать от чего я умею абстрагироваться, а от чего нет? Телепатия?
Это типа: "Мы тебя возьмем числом!" ?
Ты все время забываешь что ссылка существует и без имени. Меня интерисует этот момент. Ты зациклился на именах, т.к. за них твое толкование не распространяется?
А где сказано, что ссылку нельзя определять как странный указатель?
Я показываю как нелепо выглядит выдавание за прнципиальные отличия возможность или невозможность определенных операций над сущностями.
Так это мое виденье. Не более. Я не претендую на абсолютность, а ты претендуешь.
Это ещё одно различие, производное из того, что указатель - объект, а ссылка - нет.
Вот невижу связи между void* и void&, и тем что указатель - это объект, а ссылка - нет.
Но опять же как ещё одно отличие от указателей.
Инициализация ссылки может создавать объект, причем в этом случае время жизни объект определяется временем жизни ссылки.
С указателями такого не бывает. Инициализация указателя не может создавать объекты, и время жизни указателя всегда не влияет на время жизни объекта.
Видишь, ещё один интересный нюанс откопали.
А как следует возможность автоматического создания объекта из того, что ссылка это не объект?
После этого я назвал ссылку неявным указателем, т.к. в C++ нет других объектов, которые опреруют адресами, кроме указателей. Суть не в указателе, а в адресе объекта, без которого, по-моему, ссылка невозможна во всех ее свойствах в C++.
По-твоему.
Доказательства этого пока приведено не было.
В стандарте ничего про адреса не сказано.
А я вот считаю, что ссылка вполне может ссылаться без использования адреса и базирую свое мнение не на частных случаях реализации, а на логических выводах из стандарта:
Ссылка не объект, она может не быть в памяти -> раз её нет в памяти, значит её негде хранить значение адреса, а сл-но она ссылается на объект безо всякого использования адреса.
Пока мы выяснили, что ссылка сылается только на объекты, у которых есть адрес. Что является лишним аргументом в пользу.
В аудитории сидят люди, все сидят на пронумерованных местах (по адресам).
Но я вполне могу сослаться на кого либо по фамилии, или "эй ты, лысый".
А еще я могу сказать: "последний вошедший, встаньте" - person& lastEntered()
Так что, то что объекты расположены по адресам, еще не повод утверждать, что я не могу обратиться к ним иначе.
Можно рассматривать имя как синоним адреса. А можно и не рассматривать.
У каждого объекта, у которого есть имя, есть и адрес. Но не у каждого объекта у которого есть адрес, есть имя.
Ссылка всегда ссылается на объект у которго есть адрес, ведь мы выяснили, что ссылка всегда ссылается на объект в памяти.
Ссылка может ссылаться как на объекты у которых есть имя, так и на объекты, у которых имени нет. Однако, оба эти объекта имеют адрес. Поэтому представление ссылки через имя - верно не для всех случаев, а через адрес, как ни странно, верно для всех случаев.
Не понял логики...
Какая связь между ссылкой (альтернативным именем) и уже существующим именем объекта?
И это все что мы знаем об объекте на который ссылается ссылка, только тип? Тогда я могу считать что обе ссылки тут ссылаются на один и тот же объект?
char& c2 = *(char*)malloc(10);
extern char& c1;
extern char& c2;
Что ты знаешь об объектах, на которые ссылаются эти ссылки?
Ты можешь считать, что обе ссылки ссылаются на один объект?
Ну ты же утверждаешь, что func() - это имя. Получается что нет принципиальной разницы между r и func(), то почему должна быть разница между r и it->func().()[5], и тем более r и *p?
А я вот не пойму, при чем тут вообще *p ?
*p - это операция разыменования примененная к указателю, как это обосновывает, что r - это указатель?
Другой компилятор возьмет и не скомпилирует. Пример эксплуатирует толерантность компилятора, а не принципиальные отличия.
Но этот скомпилировал же.
Это был лишь пример за невозможностью перебрать все возможные компиляторы.
Пока ты предполагаешь, т.е. ты еще не определился? Подождем пока определишся? А то спор какой-то бессмысленный, если ты не определился со своей позицией.
Просто я честен в своих сомнениях и это единственное место, где можно прицепиться к трактовке ссылки, как имени.
Употребляем одно и то же имя 'func()', но каждый раз ссылаемся на разные объекты, как же так! Имя func() меняет объект, на который ссылается!
Это разные имена, только и всего. Имя, область которого не выходит за рамки выражения, его представляющего.
Можно считать что посредством адреса.
А для ссылки "можно считать" или однозначно?
Откуда же тебе знать от чего я умею абстрагироваться, а от чего нет? Телепатия?
Да нет, вижу из твоих доводов, которые сплошь завязаны на частную реализацию.
Ты все время забываешь что ссылка существует и без имени. Меня интерисует этот момент. Ты зациклился на именах, т.к. за них твое толкование не распространяется?
Ну а ты зациклился на адресах, хотя ссылка существует и без адресов.
А где сказано, что ссылку нельзя определять как странный указатель?
Я показываю как нелепо выглядит выдавание за прнципиальные отличия возможность или невозможность определенных операций над сущностями.
Вот тут ты пошел в отрыв от изначального контекста.
Вот невижу связи между void* и void&, и тем что указатель - это объект, а ссылка - нет.
Указатель хранит значение - адрес. Даже у void* есть это значение, хотя указатель этот не указывает на объект.
Ссылка не хранит значений, а ссылается на объект. Она не может ссылаться на объект, которого нет (и не может быть).
А как следует возможность автоматического создания объекта из того, что ссылка это не объект?
А где я выводил такое следствие?
Доказательства этого пока приведено не было.
В стандарте ничего про адреса не сказано.
А я вот считаю, что ссылка вполне может ссылаться без использования адреса и базирую свое мнение не на частных случаях реализации, а на логических выводах из стандарта:
В стандарте не сказано что же такое ссылка. Мы говорим о трактовках.
Иногда может иногда не может. Но всегда можно сказать что ссылается она на объект в памяти, т.е. объект, который абсолютно точно идентифицируется адресом. Что мешает сказать, что ссылка ссылается на адрес?
Может не быть. Если нет, то не хранит, если есть, то хранит.
Объект тоже не обязан в себе что-то хранить. Вот например, какое значение хранит в себе объект A?
Class1 A;
А если лысых несколько? А если есть однофамильцы?
А что если никто не входил в аудиторию вообще? На что будет ссылатся ссылка? Или последний входящий вышел из аудитории?
Я не говорю что ты не можешь обратиться к ним иначе.
Иногда ты можешь обратиться по имени, но ты всегда можешь обратиться к ним по адресам. Так что мешает мне думать о ссылке как об сущности ссылающийся на адрес?
Какая связь между ссылкой (альтернативным именем) и уже существующим именем объекта?
Согласен, выразился некорректно немного. Идея написана выше.
extern char& c2;
Что ты знаешь об объектах, на которые ссылаются эти ссылки?
Ты можешь считать, что обе ссылки ссылаются на один объект?
Не уходи в сторону. Там ссылки ссылаются на один объект или нет? И как это следует из твоей трактовки ссылки?
*p - это операция разыменования примененная к указателю, как это обосновывает, что r - это указатель?
Это говорит о том что у ссылки и указателя принципиальных отличий нет. Я вот тоже не пойму скаких пор func() - это имя.
Видишь, значит не все так однозначно с "другим именем", как было в начале. А если представить ссылку, как нечто ссылающееся на объект посредством адреса, то все становиться на свои места.
Что же такое имя? Я вот думал, что это идентификатор. А это оказывается такое волшебное слово, которое все объясняет.
Так я же говорю, что это только трактовка. Не более. А ты и не только в один голос утверждают, что ссылка - это другое имя и ничего другого.
Реализация - лишь пример.
Я говорю о трактовке, которая в большинстве случаев совпадает с реализацией.
Так и указатель может указывать не на адрес. :)
Я пытаюсь показать абсурдность представления ссылки только как другого имени.
У объекта, на который ссылается ссылка, всегда есть адрес или указатель.
Так где это сказано?
Ссылка не хранит значений, а ссылается на объект. Она не может ссылаться на объект, которого нет (и не может быть).
Я в этом вижу сходство, если рассматривать их как принципиально равные сущности за исключением обязательного разыменования.
А что ты имел в виду это фразой?
Твое основное утверждение, что разница между ссылкой и указателем - это то, что ссылка - не объект. А раз это довод в пользу разницы, то это довод в пользу того что ссылка не объект. Или ты у них уже другую принципиальную разницу видешь?
Иногда может иногда не может. Но всегда можно сказать что ссылается она на объект в памяти, т.е. объект, который абсолютно точно идентифицируется адресом. Что мешает сказать, что ссылка ссылается на адрес?
Мешает то, что ссылка ссылается на объект, а не на его адрес.
В примере с аудиторией я ссылаюсь на человека, а не на его место.
Может не быть. Если нет, то не хранит, если есть, то хранит.
Объект тоже не обязан в себе что-то хранить. Вот например, какое значение хранит в себе объект A?
Class1 A;
А при чем тут это? Это доказывает, что ссылка - объект?
Или что ссылка хранит адрес?
А если лысых несколько? А если есть однофамильцы?
В моей аудитории нет лысых и нет однофамильцев.
Если бы были, то я нашел бы другой способ однозначно сослаться на кого либо не используя адрес.
А что если никто не входил в аудиторию вообще? На что будет ссылатся ссылка? Или последний входящий вышел из аудитории?
А если в программе нет вообще ни одного объекта или все объекты уничтожены?
Ну что ты пытаешься докопаться?
А если "Оккама" никогда не выпускала бритвы? :)
Я не говорю что ты не можешь обратиться к ним иначе.
Иногда ты можешь обратиться по имени, но ты всегда можешь обратиться к ним по адресам. Так что мешает мне думать о ссылке как об сущности ссылающийся на адрес?
См. пример с аудиторией. Что мне мешает сказать, что я ссылаюсь на место, на котором сидит человек?
Зачем ссылаться на адрес, если мне нужен объект, а не его адрес.
- Лысый, какой номер у твоего места?
- 15.
- Человек с 15 места, встаньте.
Не уходи в сторону. Там ссылки ссылаются на один объект или нет? И как это следует из твоей трактовки ссылки?
Т.е. ответить тебе нечего.
Про объект, на которые ссылаются ссылки в твоем примере, можно сказать только что они ссылаются на объекты определенных типов. И всё!
Для того, чтобы узнать ссылаются ли они на один и тот же объект, их надо сравнить.
Это говорит о том что у ссылки и указателя принципиальных отличий нет. Я вот тоже не пойму скаких пор func() - это имя.
С тех пор, как мы трактуем ссылку, как альтернативное имя.
А с каких это пор ссылка - "неявный" указатель?
Видишь, значит не все так однозначно с "другим именем", как было в начале. А если представить ссылку, как нечто ссылающееся на объект посредством адреса, то все становиться на свои места.
Да не становится.
Если "посредством адреса", то где хранится этот адрес?
Что же такое имя? Я вот думал, что это идентификатор. А это оказывается такое волшебное слово, которое все объясняет.
Ничего волшебного. У имени есть область его актуальности (область видимости).
Так и указатель может указывать не на адрес. :)
Я пытаюсь показать абсурдность представления ссылки только как другого имени.
У объекта, на который ссылается ссылка, всегда есть адрес или указатель.
А я пытаюсь показать абсурдность представления ссылки только как "неявного указателя", "ссылающегося на объект посредством адреса".
И ответь все же на вопрос: раз имя ссылается на объект ("у которого всегда есть адрес или указатель"), оно тоже "неявный указатель" ?
Забудь на время про ссылку, скажи мне про имя.
А что ты имел в виду это фразой?
Твое основное утверждение, что разница между ссылкой и указателем - это то, что ссылка - не объект. А раз это довод в пользу разницы, то это довод в пользу того что ссылка не объект. Или ты у них уже другую принципиальную разницу видешь?
Я вижу у них ещё множество других разниц, поэтому и фраза звучала: "Видишь, ещё один интересный нюанс откопали."
В примере с аудиторией я ссылаюсь на человека, а не на его место.
А если ты знаешь о человеке только то, что он сидит за этим местом? Как ты на него ссылаться будешь?
Или что ссылка хранит адрес?
Это говорит, что объект не обзянан хранить значения. Ты кажется убеждал меня в обратном. А теперь скажи, если объект может не хранить значения, то почему ссылка не может хранить значения?
У тебя в программе все объекты имеют уникальные имена? :)
Да, но того факта, что ты можешь ссылаться на людей по номеру места это не отменяет.
"Оккама" никогда не выпускала бритвы. :)
Ничего не мешает. Однако не у всякого человека сидящего в аудитории ты можешь знать имя или занть о наличии/отсутсвии шевелюры на голове.
Т.е. ты не понимаешь на что ссылается ссылка в том примере? Как же ты программируешь?
А как сравнить ссылки? Как узнать на одинаковые они объекты ссылаются или нет?
{
// что тут нужно написать?
}
Это ты трактуешь. Я утверждаю, что это неплоное определение.
Это я трактую. Ты утверждаешь что это полный бред.
Земеть разницу.
Покажи пример, где я не могу трактовать ссылку как хранящую в себе адрес и посредством его ссылающуюся на объект.
В себе и хранит. Это трактовка, не стоит искать этому подтверждение в стандарте.
Так что же такое имя в твоей трактовке?
Так где абсурдность-то? И заметь я не настаиваю на абсолютности своего определения, в отличае от тебя.
Забудь на время про ссылку, скажи мне про имя.
Для начала скажи, что ты под именем подразумеваешь.
Так что показывает данный ньюанс?
ЗЫ. Не забудь дать определение имени.
Подниму (разыменую указатель) и спрошу его имя (создам ссылку).
Это говорит, что объект не обзянан хранить значения. Ты кажется убеждал меня в обратном.
Ты специально пытаешься запутать обсуждение?
Где я утверждал, что объект обязан хранить значение?
Я говорил о том, что ссылка не обязана хранить значение (в реализации). Одно из другого не следует.
Ссылка - не объект, поэтому она не может что-то хранить (с т.з. языка).
Кстати, то, что объект может не хранить значений, не значит, что он не располагается (не занимает) память. Объекты всегда расположены (занимают определенное место) в памяти.
И то, что он занимает место в памяти дает ему возможность хранить что-то.
Раз ссылка может не занимать память, то где она будет хранить значения?
А теперь скажи, если объект может не хранить значения, то почему ссылка не может хранить значения?
Если я не умею лаять, то почему собака не может разговаривать?
В чем логика то?
Ссылка не может хранить значения, совсем не потому, что может или не может объект.
У тебя в программе все объекты имеют уникальные имена? :)
Да. В любой well-formed программе все объекты имеют уникальные имена.
Прежде, чем решишь оспаривать, подумай про области видимости и время жизни.
Да, но того факта, что ты можешь ссылаться на людей по номеру места это не отменяет.
По номеру, я могу на них указывать, а не ссылаться.
Простой пример:
T* p = (T*)addr;
Т.о. я создал указатель на объект имея только адрес.
Если с помощью адреса мы можем ссылаться на объект, покажи мне соотв. пример со ссылкой.
Ничего не мешает. Однако не у всякого человека сидящего в аудитории ты можешь знать имя или занть о наличии/отсутсвии шевелюры на голове.
Т.е. ты не понимаешь на что ссылается ссылка в том примере? Как же ты программируешь?
Я понимаю лишь из контекста. А ты как-то иначе?
Тогда скажи, что здесь такое 'a':
А как сравнить ссылки? Как узнать на одинаковые они объекты ссылаются или нет?
{
// что тут нужно написать?
}
Написать: с1 == с2.
Только сначала посмотреть в стандарте, как сравниваются ссылки и что значит the same для ссылок.
Это ты трактуешь. Я утверждаю, что это неплоное определение.
Это не определение а трактовка. Еслиб она была полной, то была бы определением.
Твоя трактовка полная?
Это я трактую. Ты утверждаешь что это полный бред.
Цитату пожалуйста на "полный бред".
Покажи пример, где я не могу трактовать ссылку как хранящую в себе адрес и посредством его ссылающуюся на объект.
T&* pref = &ref;
T& ref = addr;
template<class T>
struct A {
typedef T* PT;
};
A<int&> a;
В себе и хранит. Это трактовка, не стоит искать этому подтверждение в стандарте.
Так что же такое имя в твоей трактовке?
в твоем примере это будет "func()"
"Это трактовка, не стоит искать этому подтверждение в стандарте."
Так где абсурдность-то? И заметь я не настаиваю на абсолютности своего определения, в отличае от тебя.
Ну а где абсурдность в моих высказываниях?
И цитату, пожалуйста, где я говорю об абсолютности.
[QUOTE=Green]
И ответь все же на вопрос: раз имя ссылается на объект ("у которого всегда есть адрес или указатель"), оно тоже "неявный указатель" ?
Забудь на время про ссылку, скажи мне про имя.
Для начала скажи, что ты под именем подразумеваешь.
[/QUOTE]
В данном случае стандартное определение. Имя для объекта.
Так что показывает данный ньюанс?
А он должен что-то показывать?
Это просто различие указателя и ссылки.
Хорошо, он показывает что ссылка - это не указатель. Легче стало?
ЗЫ. Не забудь дать определение имени.
Какого?
Стандартного? См. стандарт.
Альтернативного? У него схожее определение с определением "неявного указателя".
Ты что-то пока не дал этого определения, сколько тебя не просили.
Ссылки, как понятие, проходят сквозь многие (все наверно) языки программирования. Так что отождествлять их с указателями - нельзя: многие языки и без указателей прекрасно обходятся, зато ссылки - всюду.
Более того, ссылка может ссылаться на объект, обитающий совсем в другом процессе (и даже машине), Java и .NET тому пример.
Видеть сходство ссылки и указателя на основании одной лишь реализации - неверно.
Разве дельфин и акула имеют кровное родство? А ведь они так похожи :)
Дык и указатель может указывать куда угодно на соседний процесс :D пример - передача указателя на объект из длл.
ЗЫ: Но в целом ссылка!=указателю
Где я утверждал, что объект обязан хранить значение?
Раз ссылка может не занимать память, то где она будет хранить значения?
Так не может или не обязана. Давай уж определимся.
Указатель (в реализации) тоже не обязан хранить значение. :)
Как проверить хранит ли ссылка адрес или нет? Да никак. Это все равно что пытаться проверять средствами языка удалил ли оптимизатор объекты или нет.
Так что же такое имя? Я думал это идентификатор. У тебя везде уникальные идентификаторы?
...
По номеру, я могу на них указывать, а не ссылаться.
Но ссылаться-то ты можещь только через указывание в данном случае. К чему эта игра слов?
T* p = (T*)addr;
Т.о. я создал указатель на объект имея только адрес.
Если с помощью адреса мы можем ссылаться на объект, покажи мне соотв. пример со ссылкой.
Что показывать-то?
T& p = *(T*)addr;
Тогда скажи, что здесь такое 'a':
a - это имя, оно может быть определена как функция или объект или ссылка.
Однако, ты уклонился. Могу привести контекс, немного упростим для наглядности.
char& c1 = *alloc();
char& c2 = *alloc();
Куда ссылаются c1 и c2?
Только сначала посмотреть в стандарте, как сравниваются ссылки и что значит the same для ссылок.
Вопрос перечитай. Как узнать на один и тот же объект ссылаются ссылки или нет. А ты сравниваешь значение двух объектов.
Твоя трактовка полная?
Полнее, так она в состоянии объяснить куда ссылается ссылка при наличие имен и при их отсутсвии.
С точки зрения языка имя это не ссылка.
Имя - это употребление идентификатора. Т.е. имя представлено в программе идентификатором.
И стандарт не говорит о том, что ссылку нельзя рассматривать как нечто, хранящее адрес.
Это была не дословная цитата, однако не суть важно.
Если это не бред, значит имеет таки рациональную основу. Тогда о чем спор?
T&* pref = &ref;
T& ref = addr;
template<class T>
struct A {
typedef T* PT;
};
A<int&> a;
Ну не верно согласно семантике языка создавать указатели на ссылки, однако как это мешает мне представлять ссылки как нечно хранящее адрес?
"Это трактовка, не стоит искать этому подтверждение в стандарте."
Так ты имя по своему трактуешь или по стандарту?
В том, что ты выражения (например, func()) называешь именами.
Ты упоминал, что ты представляешь "общепринятую точку зрения на ссылки". В этом я вижу ее абсолютность.
Его можно рассматривать как синоним адреса объекта, только этот адрес определяет компилятор.
Это просто различие указателя и ссылки.
Хорошо, он показывает что ссылка - это не указатель. Легче стало?
Я с самого начала пишу, что ссылка и указатель это не одно и тоже.
Однако можно рассматривать механизм работы ссылок через адрес.
Стандартного? См. стандарт.
Так я смотрю, однако у тебя 'func()' - это тоже имя.
Ты что-то пока не дал этого определения, сколько тебя не просили.
Вообще-то дал. Ты невнимателен. Поищи, оно в конце одного из моих сообщений.
А вот что же такое имя? И как получилось, что 'func()' - это тоже имя?
И твоя тактика "сам дурак", по-моему, уже о многом говорит.
Кто с этим спорит?
Вот и не все. Существует много языков, где нет ссылок.
А указатель не может?
Кто говорит про реализацию?
Разговор ведется про интерпретацию. Ссылке невозможно дать определение. Можно дать только интерпретацию.
Наверное про объект ты все же хотел сказать наоборот.
С объектом все просто: если у него есть значение (внутреннее состояние), то он обязан его где-то хранить; если нет значения - то и хранить то нечего, но даже не смотря на это объект занимает место в памяти.
С ссылкой тоже все просто: ссылка не имеет значения (внутреннего состояния), т.е. ей и хранить то нечего.
Сколько это можно повторять, чтоб ты понял мою позицию?
Так не может или не обязана. Давай уж определимся.
Указатель (в реализации) тоже не обязан хранить значение. :)
Как проверить хранит ли ссылка адрес или нет? Да никак. Это все равно что пытаться проверять средствами языка удалил ли оптимизатор объекты или нет.
С т.з. языка не хранит. Определились.
Так что же такое имя? Я думал это идентификатор. У тебя везде уникальные идентификаторы?
В своей области видимости все идентификаторы уникальны.
Но ссылаться-то ты можещь только через указывание в данном случае. К чему эта игра слов?
Это не игра слов, а твое не желание (или не уменее) понять.
При ссылке: ссылка -> объект -> адрес(если надо)
При указателе: указатель-> адрес -> объект(если надо)
Что показывать-то?
T& p = *(T*)addr;
Здесь ты инициализируешь ссылку объектом.
Я прошу проинициализировать адресом.
a - это имя, оно может быть определена как функция или объект или ссылка.
Куда и на что ссылается 'a'?
Ты можешь это понять без контекста?
Однако, ты уклонился. Могу привести контекс, немного упростим для наглядности.
char& c1 = *alloc();
char& c2 = *alloc();
Куда ссылаются c1 и c2?
На объекты типа char. Один это объект или два сказать нельзя.
Вопрос перечитай. Как узнать на один и тот же объект ссылаются ссылки или нет. А ты сравниваешь значение двух объектов.
Напрямую никак.
Полнее, так она в состоянии объяснить куда ссылается ссылка при наличие имен и при их отсутсвии.
А зачем для этого трактовка. Это четко описано в стандарте.
Только ещё раз: ссылка ссылается не "куда", а "на что".
С точки зрения языка имя это не ссылка.
Имя - это употребление идентификатора. Т.е. имя представлено в программе идентификатором.
И стандарт не говорит о том, что ссылку нельзя рассматривать как нечто, хранящее адрес.
1. В стандарте не сказано, что ссылку нельзя рассматривать, как имя, а даже наоборот.
2. Альтернативное имя - это не идентификатор, так же как твой "неявный указатель" - это не указатель. Однако альтернативное имя куда больше похоже на имя, чем "неявный указатель" на указатель.
Это была не дословная цитата, однако не суть важно.
Если это не бред, значит имеет таки рациональную основу. Тогда о чем спор?
Нет, как раз таки важно, т.к. ты перевираешь мои слова и приписывашь не мои высказывания. И по-моему, это уже о многом говорит.
Видение, которое ты озвучиваешь, имеет рациональную основу. Однако, многие источники указывают, что данная трактовка слишком упрощена и порой вводит в заблуждение.
А спор о том, что ты утверждаешь, что ссылка оперирует адресами.
Вот это предмет спора:
[QUOTE=Nixus]
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту."
[/QUOTE]
Ну не верно согласно семантике языка создавать указатели на ссылки, однако как это мешает мне представлять ссылки как нечно хранящее адрес?
Семантика же не с потолка свалилась. Если ссылку можно представлять, как нечто хранящее адрес, то было бы плохого, если бы можно было записать int&* ?
Так ты имя по своему трактуешь или по стандарту?
А ты свой "неявный указатель" ?
В том, что ты выражения (например, func()) называешь именами.
В чем тут абсурд?
Это не абсурднее, чем говорить, что r то же самое, что *p.
Ты упоминал, что ты представляешь "общепринятую точку зрения на ссылки". В этом я вижу ее абсолютность.
Ну... тяжело тебе тогда...
Его можно рассматривать как синоним адреса объекта, только этот адрес определяет компилятор.
Синоним адреса? А зачем мне синоним адреса, если я работаю с объектами?
С++ - это ООП язык, который оперирует объектами, а не адресами, как, например, ассемблер.
А ссылка - это тоже синоним адреса?
Я с самого начала пишу, что ссылка и указатель это не одно и тоже.
Однако можно рассматривать механизм работы ссылок через адрес.
А зачем их так рассматривать?
Почему бы не рассматривать ссылки, просто, через ссылание (слово неправильное, введено специально) на объект ?
Зачем здесь ещё одна сущность - адрес?
Так я смотрю, однако у тебя 'func()' - это тоже имя.
Да именно так.
Вообще-то дал. Ты невнимателен. Поищи, оно в конце одного из моих сообщений.
Я перечитал. Ты дал несколько определений:
- указатель с автоматическим разыменовыванием и вытекающими свойствами,
- Неявный указатель и есть ссылка,
- Бритва Оккама - неявный указатель
Какое именно из них?
В любом случае каждое из них не дает представления, что же такое "неявный указатель".
А если учесть вот это:
Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?
то вообще можно запутаться.
Называется указателем, но указателем не является, не обладает интерфейсом указателя, не использует принципы указателя, но при этом автоматически разыменовывается и из этого вытекают какие-то свойства...
Может быть одно из свойств то, что этот указатель не оперирует адресами, т.к. вовсе не является указателем?
А вот что же такое имя? И как получилось, что 'func()' - это тоже имя?
А вот так вот и получилось.
Любое выражение, которое возвращает ссылку или является ссылкой, можно назвать альтернативным именем.
И твоя тактика "сам дурак", по-моему, уже о многом говорит.
Я так понимаю, что это значит, что ты можешь задавать вопросы и критиковать мою трактовку, а я должен только отвечать и защищать свое мнение? Права критики и вопросов у меня нет?
У указателя есть единственная операция - операция разыменовывания.
Если применить ее к такому указателю (на объект в другом процессе), можно с большой вероятностью AV получить, а если и получим что-то то это будет совсем не тот, объект, на который он указывает.
С ссылкой тоже все просто: ссылка не имеет значения (внутреннего состояния), т.е. ей и хранить то нечего.
Мы рассматриваем интерпретации ссылки или определение ссылки по стандарту? В стандарте, напомню, func() - это не имя.
Да, я понял твою позицию давно уже. Я покзываю что она далеко не точная. И не точнее моей.
При ссылке: ссылка -> объект -> адрес(если надо)
При указателе: указатель-> адрес -> объект(если надо)
Что лишний раз доказывает правомерность трактовки ссылки как нечта хранящего адрес (как неявный указатель).
Кстати, ссылка не может ссылаться на объекты, адрес которых невозможно определить средствами языка. Что является еще одним доводом в пользу правомерности представления ссылки как хранящей адрес.
Вот например:
{
return new int(0);
}
int main()
{
int*& a = func();
int* b = a;
return 0;
}
Почему я не могу написать так, раз 'a' это всего лишь другое имя?
Я прошу проинициализировать адресом.
А почему я не могу интерпретировать что инициализирую ее адресом?
Ты можешь это понять без контекста?
Я вообще не понимаю что такое 'a' в данном случае. Только как это соотноситься с моим примером?
Единственная идентифицирующая информация об объекте перед инициализацией ссылки - это адрес, который возвращает фнукция в указателе.
Что значит напрямую?
Да, то-то ты выражение называешь именем, хотя в стандарте имя определено по другому. :)
Это что-то, лежит где-то. Ссылаясь на что-то, мы ссылаемся куда-то.
В стандарте не сказано, что ссылку нужно рассматривать только как другое имя.
И встандарте имя определено как употребление идентификатора.
В стандарте не сказано, что ссылку нельзя рассматривать как нечто хранящее адрес (неявный указатель).
Итого: твое определение вводит новое понятие, мое определение вводит новое понятие. Значит они оба не верны с точки зрения стандарта? Или не точны?
Я делаю выводы из твоих слов. Поэтому, если это впечатление ошибочно, давай определимся, что тебя конкретно не устраивает, чтобы не возникало непоняток.
Значит, разговор об адресе имеет право на жизнь.
Кто определяет что слишком? Кого вводит в заблуждение? Где вводит в заблуждение?
Это личное мнение автора.
Ты перевираешь мои слова. Я утверждаю что это одна из интерпретаций и она самая понятная. :)
Да это интерпретация. Каждая интерпретация предполагает свою суть, однако поведение от этого не меняется. Я же не приписываю ссылке свое поведение.
Потому что ссылка это не однозначное понятие (однозначного определения не существует) и ее можно по разному интерпретировать.
Как нечно содержащее адрес. А адрес есть в стандарте.
Но ты не уклоняйся. Ты по своему трактуешь имя или по стандарту?
Это не абсурднее, чем говорить, что r то же самое, что *p.
Занчит твое определение ничуть не лучше чем мое.
Тебе не за чем, я же не призываю тебе им пользоваться. Адрес это информация об объекте, которая есть всегда. И имя ассоциируется с адресом.
Ссылка и имя это разные категории языка.
Почему бы не рассматривать ссылки, просто, через ссылание (слово неправильное, введено специально) на объект ?
Зачем здесь ещё одна сущность - адрес?
Потому что у любого существующего объекта есть адрес и иногда это единственное что позволяет к нему обратиться.
Т.е. мы будем отделять твое понятие имени от понятия имени по стандарту?
...
Какое именно из них?
В любом случае каждое из них не дает представления, что же такое "неявный указатель".
Читай тут:
[QUOTE=Nixus]
Неявный казатель - это объект который представлен указателем и при обращении к которму происходит разименование этого указателя. Что позволяет получить доступ к некоторому объекту без применения операции разыменовывания (*,->,...) и без получения адреса при инициализации (&)
[/QUOTE]
Под объектом тут подразумевается сущность.
Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?
то вообще можно запутаться.
В альтернативных именах тоже можно запутаться. Пример уже приведен, где я не могу созать ссылку на объект.
Бритва Оккама называется бритвой, но бритвой не является.
Это где же я такое говорил?
Не верное предположение.
Не понятно как?
Любую сущность, которая позволяет обратиться к объекту в памяти можно назвать неявным указателем.
Это значит, что ты сам видишь, что твои аргументы не отличаются от моих. :)
Есть. Однако, не стоит утверждать, что твоя точка зрения правильнее, на основании того что она якобы общепринятая, т.к. созвучна с определениями, которые дают другие авторы.
Ты перебрал несколько трактовок уже. А я остаюсь в одной.
Вот представим себе компилятор, в котором ссылки ведут себя в соответсвии со стандартом и они реализованы через указатели (адреса). Я могу интерпретировать при разработке на этом компиляторе ссылки как нечно содержащие адрес?
Как это соотноситься с тем, что ссылку можно представлять как нечно хранящее адрес?
Вот и покажи как в C++ создать такую ссылку, которая может, а указатель, при этом, не может.
ЗЫ. Если ты не знал, то к указателю применимы и другие операции (адресная арифметика, к примеру), и не каждый указатель можно разыменовать.
Ыыыыыы. Концептуально ссылка не хранит адрес. Хранение сервисной информации (указатель внутрях ссылки) - это уже детали реализации! К языку это имеет мало отношения.
В чистом C++ нельзя. В дотнетном можно.
Плавали-знаем (я просто утрировал). А по поводу полезности адресной арифметики в повседневных задачах можно сильно поспорить...
А при чем именно тут стандарт?
Все твои аргументы теперь сводятся к следующему:
если в стандарте func() - не имя, то ты вообще все крутишь, как хочешь.
Мы говорили про то, хранит ссылка значение или нет, а не про то является ли func() именем по стандату.
Для чего ты пытаешься запутать обсуждение?
Что лишний раз доказывает правомерность трактовки ссылки как нечта хранящего адрес (как неявный указатель).
Не понял логики. Объясни пожалуйста.
Солнце встает на Востоке, что линий раз доказывает правомерность твоей трактовки? :D
Кстати, ссылка не может ссылаться на объекты, адрес которых невозможно определить средствами языка. Что является еще одним доводом в пользу правомерности представления ссылки как хранящей адрес.
Вот например:
{
return new int(0);
}
int main()
{
int*& a = func();
int* b = a;
return 0;
}
Почему я не могу написать так, раз 'a' это всего лишь другое имя?
Потому, что ссылка не может ссылаться на временные объекты, т.к. время их жизни меньше, чем время жизни ссылки.
А вовсе не потому, можно взять адрес или нет.
А почему я не могу интерпретировать что инициализирую ее адресом?
Потому что адрес - это значение, а не объект.
Я вообще не понимаю что такое 'a' в данном случае. Только как это соотноситься с моим примером?
Это соотносится вот с этим:
Единственная идентифицирующая информация об объекте перед инициализацией ссылки - это адрес, который возвращает фнукция в указателе.
Еслиб ты инициализировал ссылку напрямую значением указателя, не было бы вопросов. Но ты разыменовываешь этот указатель и получаешь объект, которым уже инициализируешь ссылку.
Так при чем тут адрес?
Что значит напрямую?
Оперируя только ссылкой. А в общем случае вообще никак средствами языка.
Ты задал уже столько вопросов по этому своему примеру.
Может, покажешь сам чего ты хочешь добиться, чем пытаться загнать меня в ловушку.
Да, то-то ты выражение называешь именем, хотя в стандарте имя определено по другому. :)
А вот ты меня поймал... так поймал... прям ехидство зашкаливает...
Только ты забыл, что сам сказал, что мы говорим о трактовках и что твой "неявный указатель" ещё в большей степени не подходит под стандарт.
Это что-то, лежит где-то. Ссылаясь на что-то, мы ссылаемся куда-то.
И что?
Пусть лежит себе на здоровье где-то. Я ссылаюсь на объект, а не на адрес по которому он лежит.
Итого: твое определение вводит новое понятие, мое определение вводит новое понятие. Значит они оба не верны с точки зрения стандарта? Или не точны?
Они оба являются трактовками, а не определениями.
[QUOTE=Green]
Нет, как раз таки важно, т.к. ты перевираешь мои слова и приписывашь не мои высказывания. И по-моему, это уже о многом говорит.
Я делаю выводы из твоих слов. Поэтому, если это впечатление ошибочно, давай определимся, что тебя конкретно не устраивает, чтобы не возникало непоняток.
[/QUOTE]
В контексте моей фразы, под которой ты поставил свой вопрос, меня не устраивает что ты перевираешь мои слова и пытаешься т.о. предать негативную окраску всем моим постам.
Значит, разговор об адресе имеет право на жизнь.
Об адресе - нет. О "неявном указателе" - да.
Кто определяет что слишком? Кого вводит в заблуждение? Где вводит в заблуждение?
Это личное мнение автора.
Ну, например, тебя вводит в заблуждение с адресом.
Ты перевираешь мои слова. Я утверждаю что это одна из интерпретаций и она самая понятная. :)
Понятная, но неверная. Я могу принять трактовку с "неявным указателем", но вот с адресом не соглашусь.
Да это интерпретация. Каждая интерпретация предполагает свою суть, однако поведение от этого не меняется. Я же не приписываю ссылке свое поведение.
Не приписываешь намрянно, но употребляя слово "указатель" вводишь в ряд заблуждений, одним из которых является адрес.
Согласен, трактовка через альтернативное имя имеет нестройность в части касающейся func(), однако здесь можно принять, что именем будет все выражение возвращающее ссылку и имя это как и имя любого объекта актуально только пока актуален этот объект. Я не вижу чему это может помешать.
Как нечно содержащее адрес. А адрес есть в стандарте.
Но ты не уклоняйся. Ты по своему трактуешь имя или по стандарту?
Альтернативное имя я трактую по своему.
Только к чему этот вопрос, если "неявный указатель" ты тоже трактуешь по своему, а не по стандарту?
Занчит твое определение ничуть не лучше чем мое.
См выше.
Тебе не за чем, я же не призываю тебе им пользоваться. Адрес это информация об объекте, которая есть всегда. И имя ассоциируется с адресом.
Имя ассоциируется с объектом, а не с адресом. В этом и основной наш спор.
Ссылка и имя это разные категории языка.
Это как? Объясни.
И ответь все же на вопрос: А ссылка - это тоже синоним адреса?
Потому что у любого существующего объекта есть адрес и иногда это единственное что позволяет к нему обратиться.
И при чем тут ссылка?
Хоть убей не вижу связи между адресом и ссылкой.
Т.е. мы будем отделять твое понятие имени от понятия имени по стандарту?
А что по поводу твоего указателя?
Будем отделать или нет?
Что за дурацкая манера, утверждать о своих высказываниях, как о трактовке, что они т.о. не завязаны четко на стандарт и тут же пытаться жестко привязать мои трактовки к стандарту.
Соблюдай правила игры, которые сам же и устанавливаешь.
Ладно, я проглочу, что под объектом понимается сущность и даже что сущность эта "представлена указателем" (который является объектом).
Но скажи, это полное твое определение? А как же нюансы отличающие "неявный указатель"-сущность от указателя-объекта, коим представлена? Из этой вормулировки, получается, что я могу оперировать ссылкой, как указателем. Так?
И ещё интересная фраза присутствует в этом определении: "и без получения адреса при инициализации".
Значит все же без адреса?
В альтернативных именах тоже можно запутаться. Пример уже приведен, где я не могу созать ссылку на объект.
Смотри "наш ответ Чемберлену".
Бритва Оккама называется бритвой, но бритвой не является.
Тогда зачем её называть бритвой?
Это где же я такое говорил?
Вот упоминаются принципы:
Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?
А... я понял, ты не говорил ни того ни другого... ни что используют принципы, ни что НЕ используют.
Тогда вопрос: так используют или нет?
Не верное предположение.
Значит, он оперирует адресами?
Любую сущность, которая позволяет обратиться к объекту в памяти можно назвать неявным указателем.
Э... а почему бы не ссылкой.
Это было бы корректнее. Хотя бы потому, что не надо было бы добавлять, что этот указатель неявно разыменовывается, не является объектом и еще пунктов 10 несоответсвий и нюансов.
Есть. Однако, не стоит утверждать, что твоя точка зрения правильнее, на основании того что она якобы общепринятая, т.к. созвучна с определениями, которые дают другие авторы.
Я утверждаю и этим В ТОМ ЧИСЛЕ.
Ты перебрал несколько трактовок уже. А я остаюсь в одной.
Да у меня одна трактовка, просто пытаюсь донести её по разному.
Кстати, заметь, я ни разу не предрался, что ты привел уже несколько трактовок, хотя различных форм было несколько. Не так ли?
Вот представим себе компилятор, в котором ссылки ведут себя в соответсвии со стандартом и они реализованы через указатели (адреса). Я могу интерпретировать при разработке на этом компиляторе ссылки как нечно содержащие адрес?
Ты - можешь.
А я бы не представлял. Зачем мне представлять что-то и так понятное, через механизмы, которые внутри неоднозначны.
Ведь реализация ссылки неоднозначна. С этим то ты спорить не будешь?
А если объект находится в регистре? У него тоже есть адрес? :D
Ну, скажем все зависит от модели исполнения программы... В CLR например используется механизм с индексами локальных переменных и есть специальные инструкции доступа к ним - там ни слова об адресах нету.
Дай мне определение ссылки.
Вот не знаю как соотнести:
и
Мы говорим о C++ или о реализации. Ты уж определись, что ли?
И что такое чистый C++?
Так ты не утрируй, а выражайся четко. Что ты хотел показать наличаем у указателя операции разыменования?
Кто говорил о "полезности адресной арифметики в повседневных задачах"? Хочешь поговорить - заводи отдельную тему.
RTFM - читай стандарт и что там написано про переменные. Или перечитай наш диалог с Green'ом.
Адрес - это индекс байта в памяти, а память может быть любой. Ты уж определись на каком уровне мы разговариваем: стандарт или реализация?