Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ссылки и указатели

17K
14 мая 2008 года
Roy
24 / / 04.06.2007
Рыбята,
В чем принципиальная разница м\у ссылками и указателями, и когда ссылки использовать предпочтительнее:rolleyes:
Страницы:
1
16 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Nixus
Тут возвращается lvalue, согласно стандарту.
См. 5.3.1:

Заметь "T", а не "reference to T" или "T&".


Вы путаете унарный оператор &(), унарный оператор*() и объявление ссылки - T &D и указателя соответсвенно T *D - отсюда и каша.

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: kot_
прикольно. на украине в таких случаях говорят: "Не вмер Данило, а болячка задавила" (Не умер Данило, а болезнь задавила).
Стандарт 2003 года, глава 8 и в частности 8.3.2. - ссылки. Четвертая часть говорит достаточно четко - не может быть ссылки на ссылку, массива ссылок и указателя на ссылку. Достаточно странно для указателя - даже неявного, не правда ли?


По второму кругу одно и тоже?
Я писал что у указателя и неявного указателя абсолютно разное поведение. Вы все совершаете ошибку. С чего оно должно быть абсолютно схожим? Это уже плод вашего воображения.

Цитата: kot_
Что общего у ссылки с указателем? Достаточно мало. Ссылка - это действительно только псевдоним, и то что и указатель и ссылка работают с адресами в памяти, указатель и ссылка не могут быть созданны непосредственно для битового поля - но это не делает их похожими - основное различие - указатель имеет собственный адрес - ссылка нет. Поэтому вы можете сколь угодно придумывать себе терминов - явные указатели, неявные указатели, вы в праве пойти по пути госпожи Блавадской и посторить свой - неявный - стандарт языка - но только в таком случае предупреждайте честно - что это вы придумали сами.


Ты мне дай определение ссылки. Все как-то уклоняются от данного вопроса переводя тему на сравнение ссылки и указаетля. Я уже несколько раз писал почему я называю ссылку неявным указателем. Да, этот термин придумал я. Однако вы прицепились не к сути термина, а к названию. Я уже приводил пример с бритвой и "Бритвой Оккама".
С Green'ом мы уже выяснили что ссылку можно представить как псевдоним, но это не вся ее суть. Ссылка может существовать без имени как ссылки, так и объекта, на который она ссылается. Надеюсь пример приводить не нужно?

Цитата: kot_
основное различие - указатель имеет собственный адрес - ссылка нет.


Адрес указателя ты можешь получить средствами языка, а адрес ссылки - нет.

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: kot_
Вы путаете унарный оператор &(), унарный оператор*() и объявление ссылки - T &D и указателя соответсвенно T *D - отсюда и каша.


Это вы путаете, разговор как раз идет об операторе разыменования *.

3
17 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Тут возвращается lvalue, согласно стандарту.
См. 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).
Операция разыменование указателя возвращает (хорошо, не неименнованную ссылку, а) ссылочный тип.
Неименованная ссылка - это и есть ссылочный тип в чистом виде.

Поэтому нет никакого противоречия:

Цитата: Nixus
Указатель это тоже способ доступа к объекту, значит указатель это ссылка? Тут явное противоречие. :)


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

3
17 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
По второму кругу одно и тоже?
Я писал что у указателя и неявного указателя абсолютно разное поведение. Вы все совершаете ошибку. С чего оно должно быть абсолютно схожим? Это уже плод вашего воображения.


Да нет, это "неявный указатель" - плод твоего воображения.
Естествнно, все мы совершаем ошибку, это же твой "неявный указатель", вот ты им и крутишь, как хочешь.

Ты где нибудь в стандарте нашел упоминание об разыменовании "неявного указателя"? И вообще упоминание "разыменования" применительно к ссылкам?

Цитата: Nixus

Ты мне дай определение ссылки. Все как-то уклоняются от данного вопроса переводя тему на сравнение ссылки и указаетля. Я уже несколько раз писал почему я называю ссылку неявным указателем.


Но ты не разу не написал, что такоя "неявный указатель". Получается, что ссылка - это такая неявная хрень, которая почему то называется указателем, пусть и неявным.

Цитата: Nixus

Да, этот термин придумал я. Однако вы прицепились не к сути термина, а к названию.


Ну так название отржает суть, а если ещё и нет др.определения сути, то название - это единственное к чему можно апеллировать.

Цитата: Nixus

Ссылка может существовать без имени как ссылки, так и объекта, на который она ссылается.


Тогда это будет неименнованая ссылка. Делов то.

Цитата: Nixus

Адрес указателя ты можешь получить средствами языка, а адрес ссылки - нет.


Потому, что его нет. Смотри цитаты, которые я приводил выше.

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Ну чтож давай вернемся к стандарту, и именно к 5.3.1.1:

А теперь поднимаемся чуть выше и смотрим:

lvalue является ссылочным типом, т.е. lvalue ссылается на объект (3.10.2).
Операция разыменование указателя возвращает (хорошо, не неименнованную ссылку, а) ссылочный тип.
Неименованная ссылка - это и есть ссылочный тип в чистом виде.


Ты уже выкручиваешся, твой перевод слишком вольный. Там написано что lvalue ссылается на объект или функцию (lvalue referring to the object or function), а не lvalue является ссылочным типом (lvalue is a reference type).
Ссылается != возвращает ссылку.

Цитата: Green
т.к. указатель не предоставляет доступа к объекту (не ссылается на объект), доступ предоставляет ссылочный тип, который получается в результате разыменования указателя.


Если через указатель мы получаем доступ не к объекту на который он указывает, то к чему?
К чему я не могу получить доступ у объекта используя указатель на объект о вместо ссылки на него?

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Да нет, это "неявный указатель" - плод твоего воображения.
Естествнно, все мы совершаем ошибку, это же твой "неявный указатель", вот ты им и крутишь, как хочешь.
Но ты не разу не написал, что такоя "неявный указатель". Получается, что ссылка - это такая неявная хрень, которая почему то называется указателем, пусть и неявным.


Какое счастье мы ушли от сравнения указателя и ссылки. Наконец-то. :)
Я не ввожу новую сущность "неявный указатель". Я так называю ссылку. Ты путаешь причину и следствие моих расуждений.

Цитата: Green
Ты где нибудь в стандарте нашел упоминание об разыменовании "неявного указателя"? И вообще упоминание "разыменования" применительно к ссылкам?


А где я пишу что это есть в стандарте? Это лично мое виденье ссылок, вернее следствие из него.

Цитата: Green
Ну так название отржает суть, а если ещё и нет др.определения сути, то название - это единственное к чему можно апеллировать.


Да, но суть пораждает название, а не название пораждает суть. Если конечно ты не сторноник радикального идеализма. :)

Цитата: Green
Тогда это будет неименнованая ссылка. Делов то.


А что такое неименованная ссылка? Это очередной мистический "способ доступа к объекту"?

Цитата: Green
Потому, что его нет. Смотри цитаты, которые я приводил выше.


Его невозможно получить. :)
Получи мне адрес указателя, который возвращает вот эта функция :)

 
Код:
int* func()
{
      return 0;
}
3
17 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus

Я не ввожу новую сущность "неявный указатель". Я так называю ссылку.


а...
т.е. твое определение "ссылка - это неявный указатель", значит "ссылка - это ссылка".
Отличное определение. :)

Цитата: Nixus

А где я пишу что это есть в стандарте? Это лично мое виденье ссылок, вернее следствие из него.


Ну так мы обсуждаем тут ссылки не с точки зрения твоего видения, а с т.з. языка C++, т.е. его стандарта.

Цитата: Nixus

А что такое неименованная ссылка? Это очередной мистический "способ доступа к объекту"?


Есть такая вещь, как неименованные объекты, т.е. объекты у которых нет имени.
Объект типа ссылка, не имеющтий имя, называется неименнованной ссылкой.

Цитата: Nixus

Его невозможно получить. :)
Получи мне адрес указателя, который возвращает вот эта функция :)
 
Код:
int* func()
{
      return 0;
}


Результатом выполнения этой функции является rvalue, поэтому нельзя получить указатель (адрес) на это возвращаемое значение.
Однак ссылка является lvalue, почему же я не могу получить её адрес?

Цитата: Nixus
Ты уже выкручиваешся, твой перевод слишком вольный. Там написано что lvalue ссылается на объект или функцию (lvalue referring to the object or function), а не lvalue является ссылочным типом (lvalue is a reference type).
Ссылается != возвращает ссылку.


Да бог с ним, сути дело это не меняет. lvalue - это так же не адрес.
Ссылка является lvalue, и её не надо "неявно разыменовываться", чтоб ссылаться на объект.

Цитата: Nixus

Если через указатель мы получаем доступ не к объекту на который он указывает, то к чему?
К чему я не могу получить доступ у объекта используя указатель на объект о вместо ссылки на него?


Ты неверно задаешь вопрос. Не "к чему", а "как".
Доступ мы получаем (к чему?) к объекту, на который указатель указывает, но только (как?) при разыменовании,- операции, которая вернет 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

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
а...
т.е. твое определение "ссылка - это неявный указатель", значит "ссылка - это ссылка".
Отличное определение. :)


Ты опять не внимателен. Это не определение ссылки. Это один из способов ее представления. И как я считаю, наиболее полный.

Цитата: Green
Ну так мы обсуждаем тут ссылки не с точки зрения твоего видения, а с т.з. языка C++, т.е. его стандарта.


Мы обсуждаем что ж такое ссылка. Пока определения ссылки по стандарту C++ я не увидел. По-моему его там и нет.

Цитата: Green
Есть такая вещь, как неименованные объекты, т.е. объекты у которых нет имени.
Объект типа ссылка, не имеющтий имя, называется неименнованной ссылкой.


Это понятно. Но мы же говорим о сути ссылки, а не о вариантах ее названия. Или ссылка и неименованная ссылка это две разных сущности? :)

Цитата: Green
Результатом выполнения этой функции является rvalue, поэтому нельзя получить указатель (адрес) на это возвращаемое значение.


Так, давай определимся мы можем или не можем получить адрес указателя. :)

Цитата: Green
Однак ссылка является lvalue, почему же я не могу получить её адрес?


Так решил Страуструп. Не можешь и не можешь.

Цитата: Green
Да бог с ним, сути дело это не меняет. lvalue - это так же не адрес.
Ссылка является lvalue, и её не надо "неявно разыменовываться", чтоб ссылаться на объект.


lvalue это не только ссылка. Ссылка лишь частный случай lvalue. lvalue это часть синтаксиса конструкций C++, а не тип.

Цитата: Green
Ты неверно задаешь вопрос. Не "к чему", а "как".
Доступ мы получаем (к чему?) к объекту, на который указатель указывает, но только (как?) при разыменовании,- операции, которая вернет lvalue (5.3.1.1).


Не уводи в дебри. Через указатель мы можем получить доступ к объекту (ты с этим не споришь) и не важно с разыменованием или нет. Поэтому указатель, так же как и ссылка, является "способом доступа к объекту". Так что нужно искать другое определение ссыки вместо "способ доступа к объекту". :)

Цитата: Green
Я, кстати, нашел отличное определение ссылки:
http://www.umsl.edu/~subramaniana/overload1.html


Молодец. Долго искал, наверное.
А где вот тут другая переменная?

 
Код:
int& c = *(new char);

Или вот тут:
 
Код:
int& func()
{
      return *(new char);
}
func() = 'A';
3
17 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Ты опять не внимателен. Это не определение ссылки. Это один из способов ее представления. И как я считаю, наиболее полный.


Действительно невнимательный, не заметил, что ты требуешь от нас предоставить четкого определения, отметая все предложенные варианты, а сам так и не привел ни одного определения.
Тогда, в первую очередь, приведи определение ссылки.

Что значит "один из способов представления" ? Один из способов реализации?

Цитата: Nixus

Мы обсуждаем что ж такое ссылка. Пока определения ссылки по стандарту C++ я не увидел. По-моему его там и нет.


Смотри 8.3.2. Обрати там внимание на интересное предложение:

Цитата:

Note: a reference can be thought of as a name of an object.



Допустим определение в стандарте не достаточно четкое, тогда будем говорить, что мы обсуждаем ссылки с общепринятой т.з.
И тебе ни раз уже приводились эта общепринятая т.з. в виде цитат из различных источников. Вот ещё один: http://www.glenmccl.com/glos.htm#tag197
Ты же предлагаешь нам обсуждать ссылку с твоей т.з., отметая при этом общепринятую.

Я сразу предупреждаю: я не собираюсь обсуждать ссылки с твоей т.з., так как она ошибочна.

Цитата: Nixus

Так, давай определимся мы можем или не можем получить адрес указателя. :)


Мы можем получить адрес lvalue. Если объект "указатель" является lvalue, мы можем получить адрес этого объекта.

Цитата: Nixus

lvalue это не только ссылка. Ссылка лишь частный случай lvalue. lvalue это часть синтаксиса конструкций C++, а не тип.


Да, но ссылка всегда lvalue, причем не совой собственный lvalue, а другого объекта.

Цитата: Nixus

Так что нужно искать другое определение ссыки вместо "способ доступа к объекту". :)


Другое определение.
Ах да, оно тебя не устроила, т.к. не попадпет под твое "наиболее полное представление".

Цитата: Nixus

Молодец. Долго искал, наверное.
А где вот тут другая переменная?
 
Код:
int& c = *(new char);

Или вот тут:
 
Код:
int& func()
{
      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. Прежде, чем продолжать, приведи свое определение ссылки, а так же подкрепи его внешними источниками.

353
17 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Действительно невнимательный, не заметил, что ты требуешь от нас предоставить четкого определения, отметая все предложенные варианты, а сам так и не привел ни одного определения.
Тогда, в первую очередь, приведи определение ссылки.


См. ниже.

Цитата: Green
Что значит "один из способов представления" ? Один из способов реализации?


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

Цитата: Green
Смотри 8.3.2. Обрати там внимание на интересное предложение:
Цитата:
Note: a reference can be thought of as a name of an object.


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

Цитата: Green
Допустим определение в стандарте не достаточно четкое, тогда будем говорить, что мы обсуждаем ссылки с общепринятой т.з.


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

Цитата: Green
И тебе ни раз уже приводились эта общепринятая т.з. в виде цитат из различных источников. Вот ещё один: http://www.glenmccl.com/glos.htm#tag197
Ты же предлагаешь нам обсуждать ссылку с твоей т.з., отметая при этом общепринятую.


Опять там фигурирует имя. Ссылки могу существовать вообще без имен, я кажется это уже несколько раз показал.
А где я могу увидеть общпринятое понятие ссылки? Ты его не представил, а все что представлял содержат неточности или слишком расплывчаты, чтобы быть применены только к ссылке, что я и показал.

Цитата: Green
Я сразу предупреждаю: я не собираюсь обсуждать ссылки с твоей т.з., так как она ошибочна.


Я понял, ты носитель абсолютного знания. :)

Цитата: Green
Мы можем получить адрес lvalue. Если объект "указатель" является lvalue, мы можем получить адрес этого объекта.


Ты можешь получить адрес объекта на который ссылается lvalue, а не адрес lvalue. Не говори глупостей. lvalue часть синтаксиса, а не сущность в программе на C++.

Цитата: Green
Да, но ссылка всегда lvalue, причем не совой собственный lvalue, а другого объекта.


У объекта нет lvalue. Ты пишешь бред.
Объект в программе и часть синтаксиса надеюсь ты раличаешь?
Вот например:

 
Код:
func() = 'A';

Здесь 'func()' - lvalue. А ссылка это объект, который возвращает функция func.

Цитата: Green
Другое определение.
Ах да, оно тебя не устроила, т.к. не попадпет под твое "наиболее полное представление".


Это определение применимо так же к указателю. Будешь спорить?

Цитата: Green
Объект, указатель на который возвращает оператор new.


Т.е. объект, который идентифицируется по адресу, хранящемуся в указателе. Правильно?

Цитата: Green
Я согласен, что слово "переменная" вносит некоторое смущение, хотя от этого определение не становиться неверным, т.к.
Чтоб не смущаться, давай заменим слово "переменная" на слово "объект":


Ссылка - это lvalue дргого объекта?
Повторюсь у объекта нет lvalue. Объект это один из возможных варинтов lvalue. lvalue - это часть синтаксиса, которая входит в более широкую еденицу синтаксиса - expression.
Ты же не говоришь, что * это объект, посредством которого мы разыменовываем другие объекты.

Цитата: Green
P.S. Прежде, чем продолжать, приведи свое определение ссылки, а так же подкрепи его внешними источниками.


Насчет источников читай выше.
Я тебе не приведу определения ссылки, потому что его не существует (даже в стандарте). Существуют только лишь представления. Вот мое:
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту. Механизм доступа к объекту через ссылку похож на механизм доступа к объекту через указатель, за исключением того, указатель нужно разыменовывать, а ссылку нет. Поэтому ссылку можно представлять как неявно разыменовываемый указатель, или неявный указатель.
Принципиальное отличие ссылки от указателя только в автоматическом получении адреса объекта, которым мы иницируем ссылку, и отсутсвие операции разыменования * (indirection) при обращении к объекту.
Теперь ты дай свое. Только давай без имен и lvalue.

И еще, объясни мне почему люди, не способные дать определения ссылке без неточностей, считают себя авторитетными в данном вопросе?

3
18 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus

Ты можешь получить адрес объекта на который ссылается lvalue, а не адрес lvalue. Не говори глупостей. lvalue часть синтаксиса, а не сущность в программе на C++.

У объекта нет lvalue. Ты пишешь бред.


Да, согласен, намудрил. Исправляюсь:
"... ссылка всегда lvalue, причем всегда ссылающееся на уже существующий объект."

Цитата: Nixus

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


Вот здесь ты начинаешь изворачиваться.
Что значит "удаляется оптимизатором" ?
Компиляция с ключом оптимизации - это уже не компиляция C++ ?
Это всего-лишь по-другому реализованная компиляция.
В результате получается другая реализация исполняемого кода.
Об этом неоднократно и говорилось: "Many compilers will implement references as pointers, especially if debugging is enabled, but that's an implementation issue."

Где ссылка хранит адрес?
Если хранит, то ссылка ОБЯЗАТЕЛЬНО требует какой-то памяти, а это противоречит стандарту, где ясно сказано, что это не обязательно.

Цитата: Nixus

Если тебе твоя религия не позволяет использовать понятие адреса применительно к ссылке, то это твое мнение. Однако, ты выставляшь это тут как абсолютную истину.


Я выставляю это не как абсолютную истину, а как общепринятое мнение. Для чего и привожу множество цитат.

Цитата: Nixus

А где я могу увидеть общпринятое понятие ссылки? Ты его не представил, а все что представлял содержат неточности или слишком расплывчаты, чтобы быть применены только к ссылке, что я и показал.


Общепринятое понятие представлены выше многообразием цитат.
Если бы они были абсолютны, то были бы определением, а так это понятия (трактовки).

Цитата: Nixus

Т.е. объект, который идентифицируется по адресу, хранящемуся в указателе. Правильно?


Объект, который расположен в памяти по адресу...
Значением указателя является адрес (первого байта) этого объекта.

Цитата: Nixus

Насчет источников читай выше.


Э... что читать то?

Цитата: Nixus

Ссылку можно представить как псевдоним, а можно как неявный указатель.

Я тебе не приведу определения ссылки, потому что его не существует (даже в стандарте). Существуют только лишь представления. Вот мое:
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту. Механизм доступа к объекту через ссылку похож на механизм доступа к объекту через указатель, за исключением того, указатель нужно разыменовывать, а ссылку нет. Поэтому ссылку можно представлять как неявно разыменовываемый указатель, или неявный указатель.
Принципиальное отличие ссылки от указателя только в автоматическом получении адреса объекта, которым мы иницируем ссылку, и отсутсвие операции разыменования * (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.



Цитата: Nixus

Теперь ты дай свое. Только давай без имен и lvalue.


Нет уж извини, я же не требовал от тебя не использовать слова "указатель" и "адрес". Может мне ещё и согласные буквы не использовать для описания МОЕЙ трактовки?

Общепринятая трактовка в моей интерпретации:
Ссылка может расцениваться как альтернативное имя объекта. Выражения представляющие (имеющие тип) ссылки сначала приводятся к типу объекта на которые ссылаются, а уж дальше производятся все необходимые операции.
Рассматривая ссылку, как альтернативное имя объекта, очевидно, что ссылка всегда связана с объектом. При этом ссылка не может быть изменена на связь с другим объектом.
Ссылка не является объектом, и поэтому не хранит каких либо значений, а сл-но может не располагаться в памяти. Поэтому же на неё нельзя получить указатель или ссылку, и невозможно создать с помощью выражения new (new-expression).

Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку.

Цитата: Nixus

И еще, объясни мне почему люди, не способные дать определения ссылке без неточностей, считают себя авторитетными в данном вопросе?


А они не дают определения, как мы уже выяснили, - а трактовку.

353
19 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Да, согласен, намудрил. Исправляюсь:
"... ссылка всегда lvalue, причем всегда ссылающееся на уже существующий объект."


 
Код:
char& c = *(char*)0; // Тут объект существует?

Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой. А разыменование указателя тоже всегда lvalue.

Цитата: Green
Вот здесь ты начинаешь изворачиваться.
Что значит "удаляется оптимизатором" ?
Компиляция с ключом оптимизации - это уже не компиляция C++ ?
Это всего-лишь по-другому реализованная компиляция.
В результате получается другая реализация исполняемого кода.
Об этом неоднократно и говорилось: "Many compilers will implement references as pointers, especially if debugging is enabled, but that's an implementation issue."


Потому что оптимизация может удалить и указатель, указывающий на объект и вспомогательные объекты. Например, как думаешь какой код будет сгенерирован компилятором с включенной оптимизацией для данного код:

 
Код:
int main()
{
    int j = 1;
    int i = j;
    int* p = &i;
    *p = 2;
    return i;
}

Что ж нам теперь не считать j и p объектами?

Цитата: Green
Где ссылка хранит адрес?
Если хранит, то ссылка ОБЯЗАТЕЛЬНО требует какой-то памяти, а это противоречит стандарту, где ясно сказано, что это не обязательно.


Для начала было бы неплохо привести где в стандарте это написано. И где написано, что объект обязательно требует памяти.
Там где она определена, там и хранит. Так же как и объекты.

И еще: Если объект требует памяти, значит он расположен в этой памяти, и значит, если ссылка всегда ссылается на объект, то ссылка всегда ссылается на объект в памяти. А это ты пытался опровергнуть в одном из своих сообщений. Нестыковочка. :)

Цитата: Green
Я выставляю это не как абсолютную истину, а как общепринятое мнение. Для чего и привожу множество цитат.


Кем же принято это "общепринятое мнение"? Судьи кто?

Цитата: Green
Общепринятое понятие представлены выше многообразием цитат.
Если бы они были абсолютны, то были бы определением, а так это понятия (трактовки).


Т.е. каждый имеет право на свою трактовку?

Цитата: Green
Объект, который расположен в памяти по адресу...
Значением указателя является адрес (первого байта) этого объекта.


Т.е. ссылка идентифицирует объект в данном примере по адресу. Так?

Цитата: Green
Э... что читать то?


Что это личное мнение автора. Не более.

Цитата: Green
Ок, определения не существует.


Наконец, мы это выяснили.

Цитата: Green
Сойдемся на том, что мы имеем две трактовки: твое и общепринятое.


Сойдемся на 3-х, т.к. общепринятых трактовок ты приводил 2 принципиально разных:
1) Другое имя
2) lvalue другого объекта
Поэтому имеет смысл говорить о 3-х трактовках. Осталось выяснить какая из двух тобой приведенных "общепринятая".

Цитата: Green
Чем мне не нравится твоя трактовка:
1. Ссылка ссылается не на адрес, а на объект, а уж объект расположен по адресу.


Указатель указывает на объект, а объект расположен по адресу.

Цитата: Green
2. И уж тем более не программист задает (определяет) этот адрес.


Да?

 
Код:
char& c = *(char*)38476; // пожалуста, хочу и определяю этот адрес.
char& c = x; // тут я беру адрес другого объекта (я определяю что мне нужен адрес x)
char& c = *(&x + rand()); // да хоть так


Цитата: Green
3. Ссылка - не объект ! Я немного колебался в начале между "не объектом" и "неполноценным объектом", теперь утверждаю четко:
4. Ссылка является специфичным типом, это не объектный тип, коим является указатель.


Ссылка является специфичным указателем, почему от этого она должна стать объектом?

Цитата: Green
5. Отсюда принципиальное отличие ссылки от указателя - это то, что указатель является объектом, а ссылка - нет, о чем четко написано в стандарте. Отсюда и вытекают основные различия.


Цель у них одна, это альтернативный способ доступа к объекту. Это и есть суть этих сущностей. А остальное - отличие в интерфейсе.

Цитата: Green
6. А различий между ссылкой и указателем слишком много, а общее только одно - с помощью и того и др. можно обратиться к объекту.


Слишком много для кого? А судьи кто?

Цитата: Green
И то, для обращения по указателю, надо применить оператор разыменования, т.е. он ссылается на объект не на прямую а косвенно.


Да какая разница, напрямую или косвенно - цель одна. Просто у указателя больше возможностей, однако иногда пользоваться ссылкой удобнее.

Цитата: Green
Т.о. трактовка ссылки через указатель вводит в заблуждение, о чем так же приводил неоднократные цитаты.


Кого вводит в заблуждение?
Это заблуждение, что трактовка ссылки как указателя кого-то вводит в заблуждение. :)
Какие последствия могут быть, если я рассматриваю ссылку как указатель с другим интерфейсом, если я прекрасно знаю что можно делать с ссылкой, а что нельзя?

Цитата: Green
Ещё одна:


Чем дальше, тем больше религии в рассуждениях я вижу.
Это не определение. Это догма, очень слабо подкрепленная. :)

Цитата: Green
Нет уж извини, я же не требовал от тебя не использовать слова "указатель" и "адрес". Может мне ещё и согласные буквы не использовать для описания МОЕЙ трактовки?


Конечно не требовал. Ведь я утверждаю что ссылку невозможно полно определить без понятия адреса. Ведь, объект на который ссылается ссылка всегда имеет адрес (существует указатель), но не всегда имя.
Ссылку без имени я тебе уже показывал. То же касается и lvalue.

Цитата: Green
Общепринятая трактовка в моей интерпретации:
Ссылка может расцениваться как альтернативное имя объекта. Выражения представляющие (имеющие тип) ссылки сначала приводятся к типу объекта на которые ссылаются, а уж дальше производятся все необходимые операции.


В принципе согласен, однако не совсем понятно что там приводится к типу (но это не суть важно). Однако, ключевая фраза, на мой взгляд, выделена жирным.

Цитата: Green
Рассматривая ссылку, как альтернативное имя объекта, очевидно, что ссылка всегда связана с объектом. При этом ссылка не может быть изменена на связь с другим объектом.


Ссылка - это read-only сущность. Делов-то.

Цитата: Green
Ссылка не является объектом, и поэтому не хранит каких либо значений, а сл-но может не располагаться в памяти. Поэтому же на неё нельзя получить указатель или ссылку, и невозможно создать с помощью выражения new (new-expression).


Почему только объект может хранить какие-то значения? Почему я не могу понимать ссылку как нечто, хранящее значение?
Любой объект так же может не распологаться в памяти. См. пример выше.

Цитата: Green
Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку.


Вывод: '*p' или '*func()' или др. - это так же альтернативное имя объекта. Что еще раз подтверждает, что ссылка и указатель не имеют принципиальной разницы, кроме того что ссылку не нужно разыменовывать.

Цитата: Green
А они не дают определения, как мы уже выяснили, - а трактовку.


И я неоднократно показал неточность этих трактовок. Ты можешь показать неверность моей трактовки. Но ты-то утверждаешь, что твоя трактовка самая верная, а моя - вовсе не верная, вздорная и вводит в заблуждение.
Повторюсь: Что пострадает, если я буду думать о ссылке как о "странном указателе", и если я знаю как его можно применять, а как нельзя? Тем более, если в большинстве реализаций (а я думаю что вообще во всех) она реализована как указатель.

ЗЫ. По-моему, давно пора перенсти тему в "Общалку".

1.8K
19 мая 2008 года
igor_nf
256 / / 13.12.2006
Цитата:
Что пострадает, если я буду думать о ссылке как о "странном указателе", и если я знаю как его можно применять, а как нельзя?



Да ничего не будет. Просто некорректно называть ссылку вообще указателем(пускай даже и неявным:)), потому что указатель - полноценный объект и храниться в памяти, указывая при этом на какой-то др. объект. Это ж было уже сказано 1000 раз! А ссылка не имеет физической сущности - это всего лишь способ доступа к объекту. Т.е. ссылка нигде не храниться!

3
19 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
 
Код:
char& c = *(char*)0; // Тут объект существует?


Если 0 - это null pointer constant, а я не знаю, где это не так, то вся запись - это ill-formed programm.

Цитата: Nixus

Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой.


lvalue - это и есть выражение, а не его результат.

Цитата: Nixus

А разыменование указателя тоже всегда lvalue.


Во-первых, не всегда, иногда это UB.
Во-вторых, как сам говоришь, не "указатель", а "разыменование указателя". Т.е. совсем иное выражение.

Цитата: Nixus

Потому что оптимизация может удалить и указатель, указывающий на объект и вспомогательные объекты.


Я могу показать, когда при прочих равных ссылки в объектнике не будет, а указатель будет.

Цитата: Nixus

Что ж нам теперь не считать j и p объектами?


Объектами? Ты считаешь ссылку объектом, потому, что она в некоторых реализациях аллоцируется в памяти процесса?
На основании этого ты не считаешь объектами, то, что не аллоцируется в памяти процесса?
Память процесса - это реализация, а мы говори об объектах с т.з. языка программирования.

Цитата: Nixus

Для начала было бы неплохо привести где в стандарте это написано.


п.8.3.5/3

Цитата: Nixus

И где написано, что объект обязательно требует памяти.


п.1.8, 3.7

Цитата: Nixus

Там где она определена, там и хранит. Так же как и объекты.


Ссылка ничего не хранит, т.к. не является объектом.

Цитата: Nixus

И еще: Если объект требует памяти, значит он расположен в этой памяти, и значит, если ссылка всегда ссылается на объект, то ссылка всегда ссылается на объект в памяти. А это ты пытался опровергнуть в одном из своих сообщений. Нестыковочка. :)

Т.е. ссылка идентифицирует объект в данном примере по адресу. Так?


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

Цитата: Nixus

Кем же принято это "общепринятое мнение"? Судьи кто?
Т.е. каждый имеет право на свою трактовку?



Что это личное мнение автора. Не более.

Цитата: Nixus

Сойдемся на 3-х, т.к. общепринятых трактовок ты приводил 2 принципиально разных:
1) Другое имя
2) lvalue другого объекта
Поэтому имеет смысл говорить о 3-х трактовках. Осталось выяснить какая из двух тобой приведенных "общепринятая".


2) lvalue - ссылающееся на др. объект
но это не трактовка это следствие из пунктов стандарта:
1) ссылка - это lvalue
2) lvalue ссылается на объект

А так, как это в точности соответствует имени, то ссылку можно трактовать, как имя (альтернативное).

Цитата: Nixus

Указатель указывает на объект, а объект расположен по адресу.


Ссылка ссылается на объект не по средством адреса этого объекта, а указатель как раз-таки посредством адреса.

Цитата: Nixus

Да?
 
Код:
char& c = *(char*)38476; // пожалуста, хочу и определяю этот адрес.
char& c = x; // тут я беру адрес другого объекта (я определяю что мне нужен адрес x)
char& c = *(&x + rand()); // да хоть так


Вот собственно, чем и плоха твоя трактовка.
Не беруться адреса в этих примерах. Этого ты как раз понять и не можешь.
Устанавливается связь между объектом и именем (ссылкой), но никакие адреса не беруться и нигде не сохраняются, как в случае с указателем.
Ты же не говоришь, что здесь:
char c = 0;
берется адрес.

Цитата: Nixus

Ссылка является специфичным указателем, почему от этого она должна стать объектом?


Потому, что указатель - объект, это его основное свойство. Если "специфичный указатель" - не объект, значит его уже нелогично называть указателем.

Цитата: Nixus

Цель у них одна, это альтернативный способ доступа к объекту. Это и есть суть этих сущностей. А остальное - отличие в интерфейсе.


Цель у них не одна, хотя бы потому, что над указателем можно производить операции.
У них есть одна единственная схожая цель - ссылаться напрямую или косвенно на объект.
Про отличия будем опять повторяться? У них большое количество отличий.

Цитата: Nixus

Слишком много для кого? А судьи кто?


Слишком много по сравнению со сходностью.

Цитата: Nixus

Да какая разница, напрямую или косвенно - цель одна. Просто у указателя больше возможностей, однако иногда пользоваться ссылкой удобнее.


Иногда ссылкой воспрользоваться невозможно, там где можно воспользоваться указателем.

Цитата: Nixus

Кого вводит в заблуждение?
Это заблуждение, что трактовка ссылки как указателя кого-то вводит в заблуждение. :)


Ну к примеру - тебя, смотри выше свои примеры с адресами.

Цитата: Nixus

Какие последствия могут быть, если я рассматриваю ссылку как указатель с другим интерфейсом, если я прекрасно знаю что можно делать с ссылкой, а что нельзя?


Ну во-первых, я сомневаюсь, что ты "прекрасно знаешь" что можно делать, а что нет. Тебе все же придется обратиться к справочной литературе, чтоб уточнить некоторые нюансы использования ссылок.
Ссылки в некоторых (и не так уж малочисленных случаях) ведут себя не так, как указатели, поэтому они и выделены в отдельный класс типов (reference type). А рассмотрение их, как указатели (object type), может привести к некоторой путанице.
Для деталей, пройдись по стандарту поисковым запросом "reference type" и посмотри на множество уточнений для этого типа.

Цитата: Nixus

Конечно не требовал. Ведь я утверждаю что ссылку невозможно полно определить без понятия адреса. Ведь, объект на который ссылается ссылка всегда имеет адрес (существует указатель), но не всегда имя.
Ссылку без имени я тебе уже показывал. То же касается и lvalue.


э... что касается lvalue ? Ты можешь показать ссылку не являющуюся lvalue ? :D
Ну так и ссылку без адреса тебе показывали.

Цитата: Nixus

Почему только объект может хранить какие-то значения? Почему я не могу понимать ссылку как нечто, хранящее значение?
Любой объект так же может не распологаться в памяти. См. пример выше.


Любой объект располагается в памяти по определению (см. п. стандарт перечисленные выше).
Ссылку нельзя понимать как нечто хранящее что-то, т.к. она объектом не является и может вовсе не располагаться где-бы то ни было.

Цитата: Nixus

Вывод: '*p' или '*func()' или др. - это так же альтернативное имя объекта. Что еще раз подтверждает, что ссылка и указатель не имеют принципиальной разницы, кроме того что ссылку не нужно разыменовывать.


"Лопать кашу" и "каша" - это не одно и тоже.

Цитата: Nixus

Повторюсь: Что пострадает, если я буду думать о ссылке как о "странном указателе", и если я знаю как его можно применять, а как нельзя? Тем более, если в большинстве реализаций (а я думаю что вообще во всех) она реализована как указатель.


Ты вполне можешь напороться на ситуацию, когда ссылка ведет себя не как указатель.
Если рассматривать ссылку, как указатель, то замена ссылки на указатель (конечно с добавлением разыменования) или наоборот так же может привести к проблемам.
Ко многим и очень неявным проблемам. Я даже не могу перебрать сейчас перебрать все нюансы такого рефакторинга.

3
19 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: igor_nf
А ссылка не имеет физической сущности - это всего лишь способ доступа к объекту. Т.е. ссылка нигде не храниться!


В том то и проблема, что Nixus вроде бы как соглашается, что ссылка - не объект, но при этом считает, что она что-то хранит.

353
19 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Если 0 - это null pointer constant, а я не знаю, где это не так, то вся запись - это ill-formed programm.


 
Код:
char& r = *(char*)malloc();

На что тут ссылается ссылка?

Цитата: Green
lvalue - это и есть выражение, а не его результат.


Ты наверное невнимательно прочитал:
Если быть более точным, lvalue - это выражение, результат которго может быть ссылкой.
Или ссылка не может быть результатом выражения?

Цитата: Green
Во-первых, не всегда, иногда это UB.


См. 5.3.1. что возвращает оператор разыменования (indirection).

Цитата: Green
Во-вторых, как сам говоришь, не "указатель", а "разыменование указателя". Т.е. совсем иное выражение.


Дык. Я как раз и показываю что принципиальной разницы между (*p) и r - нет. Не между p и r, а между (*p) и r.

Цитата: Green
Я могу показать, когда при прочих равных ссылки в объектнике не будет, а указатель будет.


Покажи.

Цитата: Green
Объектами? Ты считаешь ссылку объектом, потому, что она в некоторых реализациях аллоцируется в памяти процесса?


Вообще, любую сущность можно назвать объектом. Другое дело, что в терминах C++ ссылка отделена от объекта. Я считаю что о ссылке можно думать как об объекте.

Цитата: Green
На основании этого ты не считаешь объектами, то, что не аллоцируется в памяти процесса?


Я то считаю. Ты забыл о чем разговор в этом отрывке, наверное. Ты спросил почему я выделил оптимизацию - я показал примером когда оптимизация делает не существующим указатель. Тем же самым образом компилятор может сделать несуществующей и ссылку.

Цитата: Green
Память процесса - это реализация, а мы говори об объектах с т.з. языка программирования.


Мы говорим о трактовке.

Цитата: Green
2) lvalue - ссылающееся на др. объект
но это не трактовка это следствие из пунктов стандарта:
1) ссылка - это lvalue
2) lvalue ссылается на объект
А так, как это в точности соответствует имени, то ссылку можно трактовать, как имя (альтернативное).


'func()' - это альтернативное имя?

Цитата: Green
Ссылка ссылается на объект не по средством адреса этого объекта, а указатель как раз-таки посредством адреса.


А посредством чего ссылается ссылка на объект, особенно, если единственная информация о том как идентифицировать объект - это адрес?

Цитата: Green
Вот собственно, чем и плоха твоя трактовка.
Не беруться адреса в этих примерах. Этого ты как раз понять и не можешь.
Устанавливается связь между объектом и именем (ссылкой), но никакие адреса не беруться и нигде не сохраняются, как в случае с указателем.


Цитата: Green
Ну к примеру - тебя, смотри выше свои примеры с адресами.


Понимаешь в чем проблема, любой существующий объект идентифицируется адресом, а вот именем не все. Если бы все ссылки можно было идентифицировать именем, то тогда моя версия была бы бредом. А т.к. существуют безымянные объекты и ссылки, сопоставление ссылки и имени режет слух (глаз).
Я понимаю что такое взять адрес и в последующем на него ссылатся, а что такое происходит вот тут:

 
Код:
int& func();
func() = 10;

с твоей точки зрения, я не понимаю.

Цитата: Green
Ты же не говоришь, что здесь:
char c = 0;
берется адрес.


А где тут ссылка?

Цитата: Green
Потому, что указатель - объект, это его основное свойство. Если "специфичный указатель" - не объект, значит его уже нелогично называть указателем.


Цитата: Green
Ссылку нельзя понимать как нечто хранящее что-то, т.к. она объектом не является и может вовсе не располагаться где-бы то ни было.


И то и другое это сущность программы посредством которых осуществляется доступ к объекту.
Это все равно что: void*, в отличае от char*, это не указатель, т.к. мы не можем его семантически верно его разыменовать.

Цитата: Green
Цель у них не одна, хотя бы потому, что над указателем можно производить операции.
У них есть одна единственная схожая цель - ссылаться напрямую или косвенно на объект.


Так это и есть главная цель. Остальное ньюансы использования.

Цитата: Green
Про отличия будем опять повторяться? У них большое количество отличий.


Дык. Интерфейс-то разный. :)

Цитата: Green
Слишком много по сравнению со сходностью.


Кто решает какой критерий приоритетнее (качественее)? Или количество привольвирует над качеством?

Цитата: Green
Иногда ссылкой воспрользоваться невозможно, там где можно воспользоваться указателем.


И наоборот. Это два интсрумента со одним смыслом, но разными возможностями - читай интерфейсом.

Цитата: Green
Ну во-первых, я сомневаюсь, что ты "прекрасно знаешь" что можно делать, а что нет.


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

Цитата: Green
Ссылки в некоторых (и не так уж малочисленных случаях) ведут себя не так, как указатели, поэтому они и выделены в отдельный класс типов (reference type).


Ведут - читай интерфейс. А суть от этого не меняется, это опосредованный доступ к объекту.

Цитата: Green
А рассмотрение их, как указатели (object type), может привести к некоторой путанице.
Да какой путанице?


Если я буду рассматривать ссылку как другое имя, то как я смогу понять что тут делается?

 
Код:
int& func();
func() = 10;

Тут нет имени ссылки, а есть то что возвращает функция, и это вносит логическую ошибку. Или мы теперь вызов функции будем именем называть?

Цитата: Green
э... что касается lvalue ? Ты можешь показать ссылку не являющуюся lvalue ? :D


Не могу, любое выражение в результате которого возвращается ссылка, может стоять слева от знака '='.
Так же как и любое выражение, которое возращает указатель можно разыменовать и поставить слева от знака '='. Однако это не говорит о его семантической верности. К примеру, разыменование void* не имеет смысла. По той же причине void& не имеет смысла. Кстати, еще одна общая черта. :)

Цитата: Green
Ну так и ссылку без адреса тебе показывали.


Да не показывали. Все что ты показывал там везде есть адрес. См. ниже свое противоречие.

Цитата: Green
Не играй в слова. Я утверждал и утверждаю, что ссылка ссылается на объект, а не на адрес в памяти или на область памяти. Ссылка не хранит (и не может хранить) значений, в т.ч. значение адреса.


Да не играю я в слова. Я хочу выяснить принципиальный момент. Ты забыл наверное, напомню:
[QUOTE=Green]
[QUOTE=Nixus]Вот покажи мне ссылку, которая ссылается не на объект в памяти.
Да уж раза три показывал:
const int& r = 5;[/QUOTE]
Это было тут.
Однако ты написал:

Цитата: Green
Любой объект располагается в памяти по определению (см. п. стандарт перечисленные выше)


Так куда ссылается ссылка r? Никак на объект в памяти.
Вывод: Любая ссылка ссылается на объект в памяти. Это верно или нет?

Цитата: Green
"Лопать кашу" и "каша" - это не одно и тоже.


"Каша в кастрюле" и "каша в тарелке" - это одна и тоже, просто чтобы съесть "кашу в кастрюле" придется открыть кастрюлю.

Цитата: Green
Ты вполне можешь напороться на ситуацию, когда ссылка ведет себя не как указатель.
Если рассматривать ссылку, как указатель, то замена ссылки на указатель (конечно с добавлением разыменования) или наоборот так же может привести к проблемам.
Ко многим и очень неявным проблемам. Я даже не могу перебрать сейчас перебрать все нюансы такого рефакторинга.


Все эти различия на уровне разности поведения (интерфейса), а суть не меняется. Но примеры все равно интересно увидеть.

353
19 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: igor_nf
Да ничего не будет.


Ч.т.д.

Цитата: igor_nf
Просто некорректно называть ссылку вообще указателем(пускай даже и неявным:)), потому что указатель - полноценный объект и храниться в памяти, указывая при этом на какой-то др. объект. Это ж было уже сказано 1000 раз! А ссылка не имеет физической сущности - это всего лишь способ доступа к объекту. Т.е. ссылка нигде не храниться!


Вот скажи почему ты выбрал главным критерием отличия - физическую сущность (хотя термин очень и очень спорный)?
И сам выбрал или прочитал в какой-то книге?

3
19 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
 
Код:
char& r = *(char*)malloc();

На что тут ссылается ссылка?


На объект типа char. Да, ты не ослышался - объект типа char.
Интересно, а на что по-твоему? :)

Цитата: Nixus

См. 5.3.1. что возвращает оператор разыменования (indirection).


Ты сначала прочти 1.9, 4.10 и 8.3.2 прежде, чем спорить.

Цитата: Nixus

Дык. Я как раз и показываю что принципиальной разницы между (*p) и r - нет. Не между p и r, а между (*p) и r.


Ну тогда нет принципиальной разницы и между r и it->func().()[5].

Цитата: Nixus

Покажи.


 
Код:
int a;

    int& volatile ri = a;
    ri = 5;

    int* volatile p = &a;
    *p = 5;

    f(ri);
    f(*p);


Цитата: Nixus

Вообще, любую сущность можно назвать объектом. Другое дело, что в терминах C++ ссылка отделена от объекта. Я считаю что о ссылке можно думать как об объекте.


Да ты вообще можешь думать о ней, что угодно. Твои мысли ей не мешают. :)

Цитата: Nixus

'func()' - это альтернативное имя?


Почему бы нет. Я же уже говорил:
"Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку."
Обратного пока доказано не было.

Цитата: Nixus

А посредством чего ссылается ссылка на объект, особенно, если единственная информация о том как идентифицировать объект - это адрес?


А по средством чего ссылается имя на объект?

Цитата: Nixus

Понимаешь в чем проблема, любой существующий объект идентифицируется адресом, а вот именем не все. Если бы все ссылки можно было идентифицировать именем, то тогда моя версия была бы бредом. А т.к. существуют безымянные объекты и ссылки, сопоставление ссылки и имени режет слух (глаз).


Понимаешь, в чем проблема,- ты не умеешь абстрагироваться от "железа", а мыслишь только реализацией.
А слух и глаз из присутствующих режет почему-то только у тебя.

Цитата: Nixus

[QUOTE=Green]
Ты же не говоришь, что здесь:
char c = 0;
берется адрес.


А где тут ссылка?
[/QUOTE]
Здесь имя и оно, как ни странно, ссылается на объект. Так что, тут тоже берется адрес?

Цитата: Nixus

И то и другое это сущность программы посредством которых осуществляется доступ к объекту.


Ну так и имя - тоже сущность и тоже ссылается. Имя тоже указатель?

Цитата: Nixus

Это все равно что: void*, в отличае от char*, это не указатель, т.к. мы не можем его семантически верно его разыменовать.


Где сказано, что void* - не указатель?

Цитата: Nixus

Так это и есть главная цель. Остальное ньюансы использования.


Если цель автомобиля и самолета одинаковая (транспортировать), то это не говорит о том, что самолет - это автомобиль, или автомобиль - это самолет. Их объединяет то, что и то и другое - транспорт.
Так вот ссылка - не указатель, а указатель - не ссылка, но с помощью обоих можно получить (напрямую или косвенно) доступ к объекту.

Цитата: Nixus

Кто решает какой критерий приоритетнее (качественее)? Или количество привольвирует над качеством?


В таком случае, почему ты настаиваешь, что "Так это и есть главная цель. Остальное ньюансы использования." ?

Цитата: Nixus

И наоборот. Это два интсрумента со одним смыслом, но разными возможностями - читай интерфейсом.


Соглашусь, что это ДВА инструмента, с "одним смыслом" не соглашусь.

Цитата: Nixus

К примеру, разыменование void* не имеет смысла. По той же причине void& не имеет смысла. Кстати, еще одна общая черта. :)


"разыменование void* не имеет смысла", void& не может существовать.
Это ещё одно различие, производное из того, что указатель - объект, а ссылка - нет.

Цитата: Nixus

Так куда ссылается ссылка r? Никак на объект в памяти.
Вывод: Любая ссылка ссылается на объект в памяти. Это верно или нет?


Да согласен слегка намудрил.
Но опять же как ещё одно отличие от указателей.
Инициализация ссылки может создавать объект, причем в этом случае время жизни объект определяется временем жизни ссылки.
С указателями такого не бывает. Инициализация указателя не может создавать объекты, и время жизни указателя всегда не влияет на время жизни объекта.
Видишь, ещё один интересный нюанс откопали.

353
19 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Если цель автомобиля и самолета одинаковая (транспортировать), то это не говорит о том, что самолет - это автомобиль, или автомобиль - это самолет. Их объединяет то, что и то и другое - транспорт.
Так вот ссылка - не указатель, а указатель - не ссылка, но с помощью обоих можно получить (напрямую или косвенно) доступ к объекту.


Ты забываешь откуда взялся указатель в моих рассуждениях. Я утверждаю что все возможности ссылки невозможно определить без утверждения что ссылка сылается на адрес (объект по адресу, через адрес). Адрес роднит ссылку и указатель.
А теперь вспомни что тебе не понравилось:
Ссылка - это псевдоним, поэтому разговор об адресе в данном контексте неправильный.
После этого я назвал ссылку неявным указателем, т.к. в C++ нет других объектов, которые опреруют адресами, кроме указателей. Суть не в указателе, а в адресе объекта, без которого, по-моему, ссылка невозможна во всех ее свойствах в C++.
Пока мы выяснили, что ссылка сылается только на объекты, у которых есть адрес. Что является лишним аргументом в пользу.

Цитата: Green
Здесь имя и оно, как ни странно, ссылается на объект. Так что, тут тоже берется адрес?


Можно рассматривать имя как синоним адреса. А можно и не рассматривать.
У каждого объекта, у которого есть имя, есть и адрес. Но не у каждого объекта у которого есть адрес, есть имя.
Ссылка всегда ссылается на объект у которго есть адрес, ведь мы выяснили, что ссылка всегда ссылается на объект в памяти.
Ссылка может ссылаться как на объекты у которых есть имя, так и на объекты, у которых имени нет. Однако, оба эти объекта имеют адрес. Поэтому представление ссылки через имя - верно не для всех случаев, а через адрес, как ни странно, верно для всех случаев.

Цитата: Green
На объект типа char. Да, ты не ослышался - объект типа char.
Интересно, а на что по-твоему? :)


И это все что мы знаем об объекте на который ссылается ссылка, только тип? Тогда я могу считать что обе ссылки тут ссылаются на один и тот же объект?

 
Код:
char& c1 = *(char*)malloc(10);
char& c2 = *(char*)malloc(10);


Цитата: Green
Ну тогда нет принципиальной разницы и между r и it->func().()[5].


Ну ты же утверждаешь, что func() - это имя. Получается что нет принципиальной разницы между r и func(), то почему должна быть разница между r и it->func().()[5], и тем более r и *p?

Цитата: Green
 
Код:
int a;

    int& volatile ri = a;
    ri = 5;

    int* volatile p = &a;
    *p = 5;

    f(ri);
    f(*p);


Цитата:
warning C4227: anachronism used : qualifiers on reference are ignored


Другой компилятор возьмет и не скомпилирует. Пример эксплуатирует толерантность компилятора, а не принципиальные отличия.

Цитата: Green
Да ты вообще можешь думать о ней, что угодно. Твои мысли ей не мешают. :)


Да вот в том-то и дело, что могу, но некоторые почему-то возмущаются.

Цитата: Green
Почему бы нет. Я же уже говорил:
"Что касается безымянных ссылок, то пока я предполагаю, что за альтернативное имя можно считать всё выражение, представляющее ссылку."
Обратного пока доказано не было.


Пока ты предполагаешь, т.е. ты еще не определился? Подождем пока определишся? А то спор какой-то бессмысленный, если ты не определился со своей позицией.
Вот смотри:

 
Код:
int& func()
{
      return *(new int);
}

func() = 0;
func() = 1;
...

Употребляем одно и то же имя 'func()', но каждый раз ссылаемся на разные объекты, как же так! Имя func() меняет объект, на который ссылается!

Цитата: Green
А по средством чего ссылается имя на объект?


Можно считать что посредством адреса.

Цитата: Green
Понимаешь, в чем проблема,- ты не умеешь абстрагироваться от "железа", а мыслишь только реализацией.


Откуда же тебе знать от чего я умею абстрагироваться, а от чего нет? Телепатия?

Цитата: Green
А слух и глаз из присутствующих режет почему-то только у тебя.


Это типа: "Мы тебя возьмем числом!" ?

Цитата: Green
Ну так и имя - тоже сущность и тоже ссылается. Имя тоже указатель?


Ты все время забываешь что ссылка существует и без имени. Меня интерисует этот момент. Ты зациклился на именах, т.к. за них твое толкование не распространяется?

Цитата: Green
Где сказано, что void* - не указатель?


А где сказано, что ссылку нельзя определять как странный указатель?
Я показываю как нелепо выглядит выдавание за прнципиальные отличия возможность или невозможность определенных операций над сущностями.

Цитата: Green
В таком случае, почему ты настаиваешь, что "Так это и есть главная цель. Остальное ньюансы использования." ?


Так это мое виденье. Не более. Я не претендую на абсолютность, а ты претендуешь.

Цитата: Green
"разыменование void* не имеет смысла", void& не может существовать.
Это ещё одно различие, производное из того, что указатель - объект, а ссылка - нет.


Вот невижу связи между void* и void&, и тем что указатель - это объект, а ссылка - нет.

Цитата: Green
Да согласен слегка намудрил.
Но опять же как ещё одно отличие от указателей.
Инициализация ссылки может создавать объект, причем в этом случае время жизни объект определяется временем жизни ссылки.
С указателями такого не бывает. Инициализация указателя не может создавать объекты, и время жизни указателя всегда не влияет на время жизни объекта.
Видишь, ещё один интересный нюанс откопали.


А как следует возможность автоматического создания объекта из того, что ссылка это не объект?

3
20 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus

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


По-твоему.
Доказательства этого пока приведено не было.
В стандарте ничего про адреса не сказано.
А я вот считаю, что ссылка вполне может ссылаться без использования адреса и базирую свое мнение не на частных случаях реализации, а на логических выводах из стандарта:
Ссылка не объект, она может не быть в памяти -> раз её нет в памяти, значит её негде хранить значение адреса, а сл-но она ссылается на объект безо всякого использования адреса.

Цитата: Nixus

Пока мы выяснили, что ссылка сылается только на объекты, у которых есть адрес. Что является лишним аргументом в пользу.


В аудитории сидят люди, все сидят на пронумерованных местах (по адресам).
Но я вполне могу сослаться на кого либо по фамилии, или "эй ты, лысый".
А еще я могу сказать: "последний вошедший, встаньте" - person& lastEntered()
Так что, то что объекты расположены по адресам, еще не повод утверждать, что я не могу обратиться к ним иначе.

Цитата: Nixus

Можно рассматривать имя как синоним адреса. А можно и не рассматривать.
У каждого объекта, у которого есть имя, есть и адрес. Но не у каждого объекта у которого есть адрес, есть имя.
Ссылка всегда ссылается на объект у которго есть адрес, ведь мы выяснили, что ссылка всегда ссылается на объект в памяти.
Ссылка может ссылаться как на объекты у которых есть имя, так и на объекты, у которых имени нет. Однако, оба эти объекта имеют адрес. Поэтому представление ссылки через имя - верно не для всех случаев, а через адрес, как ни странно, верно для всех случаев.


Не понял логики...
Какая связь между ссылкой (альтернативным именем) и уже существующим именем объекта?

Цитата: Nixus

И это все что мы знаем об объекте на который ссылается ссылка, только тип? Тогда я могу считать что обе ссылки тут ссылаются на один и тот же объект?
 
Код:
char& c1 = *(char*)malloc(10);
char& c2 = *(char*)malloc(10);


extern char& c1;
extern char& c2;
Что ты знаешь об объектах, на которые ссылаются эти ссылки?
Ты можешь считать, что обе ссылки ссылаются на один объект?

Цитата: Nixus

Ну ты же утверждаешь, что func() - это имя. Получается что нет принципиальной разницы между r и func(), то почему должна быть разница между r и it->func().()[5], и тем более r и *p?


А я вот не пойму, при чем тут вообще *p ?
*p - это операция разыменования примененная к указателю, как это обосновывает, что r - это указатель?

Цитата: Nixus

Другой компилятор возьмет и не скомпилирует. Пример эксплуатирует толерантность компилятора, а не принципиальные отличия.


Но этот скомпилировал же.
Это был лишь пример за невозможностью перебрать все возможные компиляторы.

Цитата: Nixus

Пока ты предполагаешь, т.е. ты еще не определился? Подождем пока определишся? А то спор какой-то бессмысленный, если ты не определился со своей позицией.


Просто я честен в своих сомнениях и это единственное место, где можно прицепиться к трактовке ссылки, как имени.

Цитата: Nixus

Употребляем одно и то же имя 'func()', но каждый раз ссылаемся на разные объекты, как же так! Имя func() меняет объект, на который ссылается!


Это разные имена, только и всего. Имя, область которого не выходит за рамки выражения, его представляющего.

Цитата: Nixus

Можно считать что посредством адреса.


А для ссылки "можно считать" или однозначно?

Цитата: Nixus

Откуда же тебе знать от чего я умею абстрагироваться, а от чего нет? Телепатия?


Да нет, вижу из твоих доводов, которые сплошь завязаны на частную реализацию.

Цитата: Nixus

Ты все время забываешь что ссылка существует и без имени. Меня интерисует этот момент. Ты зациклился на именах, т.к. за них твое толкование не распространяется?


Ну а ты зациклился на адресах, хотя ссылка существует и без адресов.

Цитата: Nixus

А где сказано, что ссылку нельзя определять как странный указатель?
Я показываю как нелепо выглядит выдавание за прнципиальные отличия возможность или невозможность определенных операций над сущностями.


Вот тут ты пошел в отрыв от изначального контекста.

Цитата: Nixus

Вот невижу связи между void* и void&, и тем что указатель - это объект, а ссылка - нет.


Указатель хранит значение - адрес. Даже у void* есть это значение, хотя указатель этот не указывает на объект.
Ссылка не хранит значений, а ссылается на объект. Она не может ссылаться на объект, которого нет (и не может быть).

Цитата: Nixus

А как следует возможность автоматического создания объекта из того, что ссылка это не объект?


А где я выводил такое следствие?

353
20 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
По-твоему.
Доказательства этого пока приведено не было.
В стандарте ничего про адреса не сказано.
А я вот считаю, что ссылка вполне может ссылаться без использования адреса и базирую свое мнение не на частных случаях реализации, а на логических выводах из стандарта:


В стандарте не сказано что же такое ссылка. Мы говорим о трактовках.
Иногда может иногда не может. Но всегда можно сказать что ссылается она на объект в памяти, т.е. объект, который абсолютно точно идентифицируется адресом. Что мешает сказать, что ссылка ссылается на адрес?

Цитата: Green
Ссылка не объект, она может не быть в памяти -> раз её нет в памяти, значит её негде хранить значение адреса, а сл-но она ссылается на объект безо всякого использования адреса.


Может не быть. Если нет, то не хранит, если есть, то хранит.
Объект тоже не обязан в себе что-то хранить. Вот например, какое значение хранит в себе объект A?

 
Код:
class Class1 {};
Class1 A;


Цитата: Green
Но я вполне могу сослаться на кого либо по фамилии, или "эй ты, лысый".


А если лысых несколько? А если есть однофамильцы?

Цитата: Green
А еще я могу сказать: "последний вошедший, встаньте" - person& lastEntered()


А что если никто не входил в аудиторию вообще? На что будет ссылатся ссылка? Или последний входящий вышел из аудитории?

Цитата: Green
Так что, то что объекты расположены по адресам, еще не повод утверждать, что я не могу обратиться к ним иначе.


Я не говорю что ты не можешь обратиться к ним иначе.
Иногда ты можешь обратиться по имени, но ты всегда можешь обратиться к ним по адресам. Так что мешает мне думать о ссылке как об сущности ссылающийся на адрес?

Цитата: Green
Не понял логики...
Какая связь между ссылкой (альтернативным именем) и уже существующим именем объекта?


Согласен, выразился некорректно немного. Идея написана выше.

Цитата: Green
extern char& c1;
extern char& c2;
Что ты знаешь об объектах, на которые ссылаются эти ссылки?
Ты можешь считать, что обе ссылки ссылаются на один объект?


Не уходи в сторону. Там ссылки ссылаются на один объект или нет? И как это следует из твоей трактовки ссылки?

Цитата: Green
А я вот не пойму, при чем тут вообще *p ?
*p - это операция разыменования примененная к указателю, как это обосновывает, что r - это указатель?


Это говорит о том что у ссылки и указателя принципиальных отличий нет. Я вот тоже не пойму скаких пор func() - это имя.

Цитата: Green
Просто я честен в своих сомнениях и это единственное место, где можно прицепиться к трактовке ссылки, как имени.


Видишь, значит не все так однозначно с "другим именем", как было в начале. А если представить ссылку, как нечто ссылающееся на объект посредством адреса, то все становиться на свои места.

Цитата: Green
Это разные имена, только и всего. Имя, область которого не выходит за рамки выражения, его представляющего.


Что же такое имя? Я вот думал, что это идентификатор. А это оказывается такое волшебное слово, которое все объясняет.

Цитата: Green
А для ссылки "можно считать" или однозначно?


Так я же говорю, что это только трактовка. Не более. А ты и не только в один голос утверждают, что ссылка - это другое имя и ничего другого.

Цитата: Green
Да нет, вижу из твоих доводов, которые сплошь завязаны на частную реализацию.


Реализация - лишь пример.
Я говорю о трактовке, которая в большинстве случаев совпадает с реализацией.

Цитата: Green
Ну а ты зациклился на адресах, хотя ссылка существует и без адресов.


Так и указатель может указывать не на адрес. :)
Я пытаюсь показать абсурдность представления ссылки только как другого имени.
У объекта, на который ссылается ссылка, всегда есть адрес или указатель.

Цитата: Green
Вот тут ты пошел в отрыв от изначального контекста.


Так где это сказано?

Цитата: Green
Указатель хранит значение - адрес. Даже у void* есть это значение, хотя указатель этот не указывает на объект.
Ссылка не хранит значений, а ссылается на объект. Она не может ссылаться на объект, которого нет (и не может быть).


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

Цитата: Green
А где я выводил такое следствие?


А что ты имел в виду это фразой?
Твое основное утверждение, что разница между ссылкой и указателем - это то, что ссылка - не объект. А раз это довод в пользу разницы, то это довод в пользу того что ссылка не объект. Или ты у них уже другую принципиальную разницу видешь?

3
20 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
В стандарте не сказано что же такое ссылка. Мы говорим о трактовках.
Иногда может иногда не может. Но всегда можно сказать что ссылается она на объект в памяти, т.е. объект, который абсолютно точно идентифицируется адресом. Что мешает сказать, что ссылка ссылается на адрес?


Мешает то, что ссылка ссылается на объект, а не на его адрес.
В примере с аудиторией я ссылаюсь на человека, а не на его место.

Цитата: Nixus

Может не быть. Если нет, то не хранит, если есть, то хранит.
Объект тоже не обязан в себе что-то хранить. Вот например, какое значение хранит в себе объект A?
 
Код:
class Class1 {};
Class1 A;


А при чем тут это? Это доказывает, что ссылка - объект?
Или что ссылка хранит адрес?

Цитата: Nixus

А если лысых несколько? А если есть однофамильцы?


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

Цитата: Nixus

А что если никто не входил в аудиторию вообще? На что будет ссылатся ссылка? Или последний входящий вышел из аудитории?


А если в программе нет вообще ни одного объекта или все объекты уничтожены?
Ну что ты пытаешься докопаться?
А если "Оккама" никогда не выпускала бритвы? :)

Цитата: Nixus

Я не говорю что ты не можешь обратиться к ним иначе.
Иногда ты можешь обратиться по имени, но ты всегда можешь обратиться к ним по адресам. Так что мешает мне думать о ссылке как об сущности ссылающийся на адрес?


См. пример с аудиторией. Что мне мешает сказать, что я ссылаюсь на место, на котором сидит человек?
Зачем ссылаться на адрес, если мне нужен объект, а не его адрес.
- Лысый, какой номер у твоего места?
- 15.
- Человек с 15 места, встаньте.

Цитата: Nixus

Не уходи в сторону. Там ссылки ссылаются на один объект или нет? И как это следует из твоей трактовки ссылки?


Т.е. ответить тебе нечего.
Про объект, на которые ссылаются ссылки в твоем примере, можно сказать только что они ссылаются на объекты определенных типов. И всё!
Для того, чтобы узнать ссылаются ли они на один и тот же объект, их надо сравнить.

Цитата: Nixus

Это говорит о том что у ссылки и указателя принципиальных отличий нет. Я вот тоже не пойму скаких пор func() - это имя.


С тех пор, как мы трактуем ссылку, как альтернативное имя.
А с каких это пор ссылка - "неявный" указатель?

Цитата: Nixus

Видишь, значит не все так однозначно с "другим именем", как было в начале. А если представить ссылку, как нечто ссылающееся на объект посредством адреса, то все становиться на свои места.


Да не становится.
Если "посредством адреса", то где хранится этот адрес?

Цитата: Nixus

Что же такое имя? Я вот думал, что это идентификатор. А это оказывается такое волшебное слово, которое все объясняет.


Ничего волшебного. У имени есть область его актуальности (область видимости).

Цитата: Nixus

Так и указатель может указывать не на адрес. :)
Я пытаюсь показать абсурдность представления ссылки только как другого имени.
У объекта, на который ссылается ссылка, всегда есть адрес или указатель.


А я пытаюсь показать абсурдность представления ссылки только как "неявного указателя", "ссылающегося на объект посредством адреса".

И ответь все же на вопрос: раз имя ссылается на объект ("у которого всегда есть адрес или указатель"), оно тоже "неявный указатель" ?
Забудь на время про ссылку, скажи мне про имя.

Цитата: Nixus

А что ты имел в виду это фразой?
Твое основное утверждение, что разница между ссылкой и указателем - это то, что ссылка - не объект. А раз это довод в пользу разницы, то это довод в пользу того что ссылка не объект. Или ты у них уже другую принципиальную разницу видешь?


Я вижу у них ещё множество других разниц, поэтому и фраза звучала: "Видишь, ещё один интересный нюанс откопали."

353
20 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Мешает то, что ссылка ссылается на объект, а не на его адрес.
В примере с аудиторией я ссылаюсь на человека, а не на его место.


А если ты знаешь о человеке только то, что он сидит за этим местом? Как ты на него ссылаться будешь?

Цитата: Green
А при чем тут это? Это доказывает, что ссылка - объект?
Или что ссылка хранит адрес?


Это говорит, что объект не обзянан хранить значения. Ты кажется убеждал меня в обратном. А теперь скажи, если объект может не хранить значения, то почему ссылка не может хранить значения?

Цитата: Green
В моей аудитории нет лысых и нет однофамильцев.


У тебя в программе все объекты имеют уникальные имена? :)

Цитата: Green
Если бы были, то я нашел бы другой способ однозначно сослаться на кого либо не используя адрес.


Да, но того факта, что ты можешь ссылаться на людей по номеру места это не отменяет.

Цитата: Green
А если "Оккама" никогда не выпускала бритвы? :)


"Оккама" никогда не выпускала бритвы. :)

Цитата: Green
См. пример с аудиторией. Что мне мешает сказать, что я ссылаюсь на место, на котором сидит человек?


Ничего не мешает. Однако не у всякого человека сидящего в аудитории ты можешь знать имя или занть о наличии/отсутсвии шевелюры на голове.

Цитата: Green
Про объект, на которые ссылаются ссылки в твоем примере, можно сказать только что они ссылаются на объекты определенных типов. И всё!


Т.е. ты не понимаешь на что ссылается ссылка в том примере? Как же ты программируешь?

Цитата: Green
Для того, чтобы узнать ссылаются ли они на один и тот же объект, их надо сравнить.


А как сравнить ссылки? Как узнать на одинаковые они объекты ссылаются или нет?

 
Код:
int isSameObject(char& c1, char& c2)
{
      // что тут нужно написать?
}


Цитата: Green
С тех пор, как мы трактуем ссылку, как альтернативное имя.


Это ты трактуешь. Я утверждаю, что это неплоное определение.

Цитата: Green
А с каких это пор ссылка - "неявный" указатель?


Это я трактую. Ты утверждаешь что это полный бред.

Земеть разницу.

Цитата: Green
Да не становится.


Покажи пример, где я не могу трактовать ссылку как хранящую в себе адрес и посредством его ссылающуюся на объект.

Цитата: Green
Если "посредством адреса", то где хранится этот адрес?


В себе и хранит. Это трактовка, не стоит искать этому подтверждение в стандарте.

Цитата: Green
Ничего волшебного. У имени есть область его актуальности (область видимости).


Так что же такое имя в твоей трактовке?

Цитата: Green
А я пытаюсь показать абсурдность представления ссылки только как "неявного указателя", "ссылающегося на объект посредством адреса".


Так где абсурдность-то? И заметь я не настаиваю на абсолютности своего определения, в отличае от тебя.

Цитата: Green
И ответь все же на вопрос: раз имя ссылается на объект ("у которого всегда есть адрес или указатель"), оно тоже "неявный указатель" ?
Забудь на время про ссылку, скажи мне про имя.


Для начала скажи, что ты под именем подразумеваешь.

Цитата: Green
Я вижу у них ещё множество других разниц, поэтому и фраза звучала: "Видишь, ещё один интересный нюанс откопали."


Так что показывает данный ньюанс?

ЗЫ. Не забудь дать определение имени.

3
20 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
А если ты знаешь о человеке только то, что он сидит за этим местом? Как ты на него ссылаться будешь?


Подниму (разыменую указатель) и спрошу его имя (создам ссылку).

Цитата: Nixus

Это говорит, что объект не обзянан хранить значения. Ты кажется убеждал меня в обратном.


Ты специально пытаешься запутать обсуждение?
Где я утверждал, что объект обязан хранить значение?
Я говорил о том, что ссылка не обязана хранить значение (в реализации). Одно из другого не следует.
Ссылка - не объект, поэтому она не может что-то хранить (с т.з. языка).

Кстати, то, что объект может не хранить значений, не значит, что он не располагается (не занимает) память. Объекты всегда расположены (занимают определенное место) в памяти.
И то, что он занимает место в памяти дает ему возможность хранить что-то.

Раз ссылка может не занимать память, то где она будет хранить значения?

Цитата: Nixus

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


Если я не умею лаять, то почему собака не может разговаривать?
В чем логика то?
Ссылка не может хранить значения, совсем не потому, что может или не может объект.

Цитата: Nixus

У тебя в программе все объекты имеют уникальные имена? :)


Да. В любой well-formed программе все объекты имеют уникальные имена.
Прежде, чем решишь оспаривать, подумай про области видимости и время жизни.

Цитата: Nixus

Да, но того факта, что ты можешь ссылаться на людей по номеру места это не отменяет.


По номеру, я могу на них указывать, а не ссылаться.

Простой пример:

 
Код:
new(addr) T;
T* p = (T*)addr;

Т.о. я создал указатель на объект имея только адрес.
Если с помощью адреса мы можем ссылаться на объект, покажи мне соотв. пример со ссылкой.

Цитата: Nixus

Ничего не мешает. Однако не у всякого человека сидящего в аудитории ты можешь знать имя или занть о наличии/отсутсвии шевелюры на голове.



Цитата: Nixus

Т.е. ты не понимаешь на что ссылается ссылка в том примере? Как же ты программируешь?


Я понимаю лишь из контекста. А ты как-то иначе?
Тогда скажи, что здесь такое 'a':

 
Код:
a();


Цитата: Nixus

А как сравнить ссылки? Как узнать на одинаковые они объекты ссылаются или нет?
 
Код:
int isSameObject(char& c1, char& c2)
{
      // что тут нужно написать?
}


Написать: с1 == с2.
Только сначала посмотреть в стандарте, как сравниваются ссылки и что значит the same для ссылок.

Цитата: Nixus

Это ты трактуешь. Я утверждаю, что это неплоное определение.


Это не определение а трактовка. Еслиб она была полной, то была бы определением.
Твоя трактовка полная?

Цитата: Nixus

Это я трактую. Ты утверждаешь что это полный бред.


Цитату пожалуйста на "полный бред".

Цитата: Nixus

Покажи пример, где я не могу трактовать ссылку как хранящую в себе адрес и посредством его ссылающуюся на объект.


T&* pref = &ref;

T& ref = addr;


template<class T>
struct A {
typedef T* PT;
};
A<int&> a;

Цитата: Nixus

В себе и хранит. Это трактовка, не стоит искать этому подтверждение в стандарте.



Цитата: Nixus

Так что же такое имя в твоей трактовке?


в твоем примере это будет "func()"
"Это трактовка, не стоит искать этому подтверждение в стандарте."

Цитата: Nixus

Так где абсурдность-то? И заметь я не настаиваю на абсолютности своего определения, в отличае от тебя.


Ну а где абсурдность в моих высказываниях?
И цитату, пожалуйста, где я говорю об абсолютности.

Цитата: Nixus

[QUOTE=Green]
И ответь все же на вопрос: раз имя ссылается на объект ("у которого всегда есть адрес или указатель"), оно тоже "неявный указатель" ?
Забудь на время про ссылку, скажи мне про имя.


Для начала скажи, что ты под именем подразумеваешь.
[/QUOTE]
В данном случае стандартное определение. Имя для объекта.

Цитата: Nixus

Так что показывает данный ньюанс?


А он должен что-то показывать?
Это просто различие указателя и ссылки.
Хорошо, он показывает что ссылка - это не указатель. Легче стало?

Цитата: Nixus

ЗЫ. Не забудь дать определение имени.


Какого?
Стандартного? См. стандарт.
Альтернативного? У него схожее определение с определением "неявного указателя".
Ты что-то пока не дал этого определения, сколько тебя не просили.

5
20 мая 2008 года
hardcase
4.5K / / 09.08.2005
Несколько оторвано от C++.

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

Более того, ссылка может ссылаться на объект, обитающий совсем в другом процессе (и даже машине), Java и .NET тому пример.

Видеть сходство ссылки и указателя на основании одной лишь реализации - неверно.
Разве дельфин и акула имеют кровное родство? А ведь они так похожи :)
11
20 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
Более того, ссылка может ссылаться на объект, обитающий совсем в другом процессе



Дык и указатель может указывать куда угодно на соседний процесс :D пример - передача указателя на объект из длл.

ЗЫ: Но в целом ссылка!=указателю

353
20 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
Ты специально пытаешься запутать обсуждение?
Где я утверждал, что объект обязан хранить значение?



Так не может или не обязана. Давай уж определимся.
Указатель (в реализации) тоже не обязан хранить значение. :)
Как проверить хранит ли ссылка адрес или нет? Да никак. Это все равно что пытаться проверять средствами языка удалил ли оптимизатор объекты или нет.

Цитата: Green
Да. В любой well-formed программе все объекты имеют уникальные имена.


Так что же такое имя? Я думал это идентификатор. У тебя везде уникальные идентификаторы?

Цитата: Green
Подниму (разыменую указатель) и спрошу его имя (создам ссылку).
...
По номеру, я могу на них указывать, а не ссылаться.


Но ссылаться-то ты можещь только через указывание в данном случае. К чему эта игра слов?

Цитата: Green
Простой пример:
 
Код:
new(addr) T;
T* p = (T*)addr;

Т.о. я создал указатель на объект имея только адрес.
Если с помощью адреса мы можем ссылаться на объект, покажи мне соотв. пример со ссылкой.


Что показывать-то?

 
Код:
new (addr) T;
T& p = *(T*)addr;


Цитата: Green
Я понимаю лишь из контекста. А ты как-то иначе?
Тогда скажи, что здесь такое 'a':
 
Код:
a();


a - это имя, оно может быть определена как функция или объект или ссылка.
Однако, ты уклонился. Могу привести контекс, немного упростим для наглядности.

 
Код:
char* alloc();
char& c1 = *alloc();
char& c2 = *alloc();

Куда ссылаются c1 и c2?

Цитата: Green
Написать: с1 == с2.
Только сначала посмотреть в стандарте, как сравниваются ссылки и что значит the same для ссылок.


Вопрос перечитай. Как узнать на один и тот же объект ссылаются ссылки или нет. А ты сравниваешь значение двух объектов.

Цитата: Green
Это не определение а трактовка. Еслиб она была полной, то была бы определением.
Твоя трактовка полная?


Полнее, так она в состоянии объяснить куда ссылается ссылка при наличие имен и при их отсутсвии.
С точки зрения языка имя это не ссылка.
Имя - это употребление идентификатора. Т.е. имя представлено в программе идентификатором.
И стандарт не говорит о том, что ссылку нельзя рассматривать как нечто, хранящее адрес.

Цитата: Green
Цитату пожалуйста на "полный бред".


Это была не дословная цитата, однако не суть важно.
Если это не бред, значит имеет таки рациональную основу. Тогда о чем спор?

Цитата: Green

T&* pref = &ref;

T& ref = addr;

template<class T>
struct A {
typedef T* PT;
};
A<int&> a;


Ну не верно согласно семантике языка создавать указатели на ссылки, однако как это мешает мне представлять ссылки как нечно хранящее адрес?

Цитата: Green
в твоем примере это будет "func()"
"Это трактовка, не стоит искать этому подтверждение в стандарте."


Так ты имя по своему трактуешь или по стандарту?

Цитата: Green
Ну а где абсурдность в моих высказываниях?


В том, что ты выражения (например, func()) называешь именами.

Цитата: Green
И цитату, пожалуйста, где я говорю об абсолютности.


Ты упоминал, что ты представляешь "общепринятую точку зрения на ссылки". В этом я вижу ее абсолютность.

Цитата: Green
В данном случае стандартное определение. Имя для объекта.


Его можно рассматривать как синоним адреса объекта, только этот адрес определяет компилятор.

Цитата: Green
А он должен что-то показывать?
Это просто различие указателя и ссылки.
Хорошо, он показывает что ссылка - это не указатель. Легче стало?


Я с самого начала пишу, что ссылка и указатель это не одно и тоже.
Однако можно рассматривать механизм работы ссылок через адрес.

Цитата: Green
Какого?
Стандартного? См. стандарт.


Так я смотрю, однако у тебя 'func()' - это тоже имя.

Цитата: Green
Альтернативного? У него схожее определение с определением "неявного указателя".
Ты что-то пока не дал этого определения, сколько тебя не просили.


Вообще-то дал. Ты невнимателен. Поищи, оно в конце одного из моих сообщений.
А вот что же такое имя? И как получилось, что 'func()' - это тоже имя?

И твоя тактика "сам дурак", по-моему, уже о многом говорит.

353
20 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: oxotnik333
ЗЫ: Но в целом ссылка!=указателю


Кто с этим спорит?

353
20 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
Ссылки, как понятие, проходят сквозь многие (все наверно) языки программирования. Так что отождествлять их с указателями - нельзя: многие языки и без указателей прекрасно обходятся, зато ссылки - всюду.


Вот и не все. Существует много языков, где нет ссылок.

Цитата: hardcase
Более того, ссылка может ссылаться на объект, обитающий совсем в другом процессе (и даже машине), Java и .NET тому пример.


А указатель не может?

Цитата: hardcase
Видеть сходство ссылки и указателя на основании одной лишь реализации - неверно.


Кто говорит про реализацию?
Разговор ведется про интерпретацию. Ссылке невозможно дать определение. Можно дать только интерпретацию.

63
20 мая 2008 года
Zorkus
2.6K / / 04.11.2006
Я влезу в обсуждение и посоветую не оттягивать внимание на другие языки. Что такое есть reference types в Java, например, и как они работают, и чем отличаются от функционально-похожих сущностей в C++ - это тема для отдельного обсуждения.
3
20 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Внутренне состояние (читай хранения значение) отлчичает объект от ссылки. Т.е. объект, в отличае от ссылки, не хранит значения.


Наверное про объект ты все же хотел сказать наоборот.
С объектом все просто: если у него есть значение (внутреннее состояние), то он обязан его где-то хранить; если нет значения - то и хранить то нечего, но даже не смотря на это объект занимает место в памяти.
С ссылкой тоже все просто: ссылка не имеет значения (внутреннего состояния), т.е. ей и хранить то нечего.

Сколько это можно повторять, чтоб ты понял мою позицию?

Цитата: Nixus

Так не может или не обязана. Давай уж определимся.
Указатель (в реализации) тоже не обязан хранить значение. :)
Как проверить хранит ли ссылка адрес или нет? Да никак. Это все равно что пытаться проверять средствами языка удалил ли оптимизатор объекты или нет.


С т.з. языка не хранит. Определились.

Цитата: Nixus

Так что же такое имя? Я думал это идентификатор. У тебя везде уникальные идентификаторы?


В своей области видимости все идентификаторы уникальны.

Цитата: Nixus

Но ссылаться-то ты можещь только через указывание в данном случае. К чему эта игра слов?


Это не игра слов, а твое не желание (или не уменее) понять.
При ссылке: ссылка -> объект -> адрес(если надо)
При указателе: указатель-> адрес -> объект(если надо)

Цитата: Nixus

Что показывать-то?
 
Код:
new (addr) T;
T& p = *(T*)addr;


Здесь ты инициализируешь ссылку объектом.
Я прошу проинициализировать адресом.

Цитата: Nixus

a - это имя, оно может быть определена как функция или объект или ссылка.


Куда и на что ссылается 'a'?
Ты можешь это понять без контекста?

Цитата: Nixus

Однако, ты уклонился. Могу привести контекс, немного упростим для наглядности.
 
Код:
char* alloc();
char& c1 = *alloc();
char& c2 = *alloc();

Куда ссылаются c1 и c2?


На объекты типа char. Один это объект или два сказать нельзя.

Цитата: Nixus

Вопрос перечитай. Как узнать на один и тот же объект ссылаются ссылки или нет. А ты сравниваешь значение двух объектов.


Напрямую никак.

Цитата: Nixus

Полнее, так она в состоянии объяснить куда ссылается ссылка при наличие имен и при их отсутсвии.


А зачем для этого трактовка. Это четко описано в стандарте.
Только ещё раз: ссылка ссылается не "куда", а "на что".

Цитата: Nixus

С точки зрения языка имя это не ссылка.
Имя - это употребление идентификатора. Т.е. имя представлено в программе идентификатором.
И стандарт не говорит о том, что ссылку нельзя рассматривать как нечто, хранящее адрес.


1. В стандарте не сказано, что ссылку нельзя рассматривать, как имя, а даже наоборот.
2. Альтернативное имя - это не идентификатор, так же как твой "неявный указатель" - это не указатель. Однако альтернативное имя куда больше похоже на имя, чем "неявный указатель" на указатель.

Цитата: Nixus

Это была не дословная цитата, однако не суть важно.
Если это не бред, значит имеет таки рациональную основу. Тогда о чем спор?


Нет, как раз таки важно, т.к. ты перевираешь мои слова и приписывашь не мои высказывания. И по-моему, это уже о многом говорит.

Видение, которое ты озвучиваешь, имеет рациональную основу. Однако, многие источники указывают, что данная трактовка слишком упрощена и порой вводит в заблуждение.
А спор о том, что ты утверждаешь, что ссылка оперирует адресами.
Вот это предмет спора:
[QUOTE=Nixus]
Ссылка - это объект, который ссылается на определяемый программистом (не компилятором) адрес в памяти и посредством которого можно получить доступ к объекту."
[/QUOTE]


Цитата: Nixus

Ну не верно согласно семантике языка создавать указатели на ссылки, однако как это мешает мне представлять ссылки как нечно хранящее адрес?


Семантика же не с потолка свалилась. Если ссылку можно представлять, как нечто хранящее адрес, то было бы плохого, если бы можно было записать int&* ?

Цитата: Nixus

Так ты имя по своему трактуешь или по стандарту?


А ты свой "неявный указатель" ?

Цитата: Nixus

В том, что ты выражения (например, func()) называешь именами.


В чем тут абсурд?
Это не абсурднее, чем говорить, что r то же самое, что *p.

Цитата: Nixus

Ты упоминал, что ты представляешь "общепринятую точку зрения на ссылки". В этом я вижу ее абсолютность.


Ну... тяжело тебе тогда...

Цитата: Nixus

Его можно рассматривать как синоним адреса объекта, только этот адрес определяет компилятор.


Синоним адреса? А зачем мне синоним адреса, если я работаю с объектами?
С++ - это ООП язык, который оперирует объектами, а не адресами, как, например, ассемблер.

А ссылка - это тоже синоним адреса?

Цитата: Nixus

Я с самого начала пишу, что ссылка и указатель это не одно и тоже.
Однако можно рассматривать механизм работы ссылок через адрес.


А зачем их так рассматривать?
Почему бы не рассматривать ссылки, просто, через ссылание (слово неправильное, введено специально) на объект ?
Зачем здесь ещё одна сущность - адрес?

Цитата: Nixus

Так я смотрю, однако у тебя 'func()' - это тоже имя.


Да именно так.

Цитата: Nixus

Вообще-то дал. Ты невнимателен. Поищи, оно в конце одного из моих сообщений.


Я перечитал. Ты дал несколько определений:

- указатель с автоматическим разыменовыванием и вытекающими свойствами,
- Неявный указатель и есть ссылка,
- Бритва Оккама - неявный указатель

Какое именно из них?
В любом случае каждое из них не дает представления, что же такое "неявный указатель".

А если учесть вот это:
Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?
то вообще можно запутаться.

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

Может быть одно из свойств то, что этот указатель не оперирует адресами, т.к. вовсе не является указателем?

Цитата: Nixus

А вот что же такое имя? И как получилось, что 'func()' - это тоже имя?


А вот так вот и получилось.
Любое выражение, которое возвращает ссылку или является ссылкой, можно назвать альтернативным именем.

Цитата: Nixus

И твоя тактика "сам дурак", по-моему, уже о многом говорит.


Я так понимаю, что это значит, что ты можешь задавать вопросы и критиковать мою трактовку, а я должен только отвечать и защищать свое мнение? Права критики и вопросов у меня нет?

5
20 мая 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Nixus
А указатель не может?


У указателя есть единственная операция - операция разыменовывания.
Если применить ее к такому указателю (на объект в другом процессе), можно с большой вероятностью AV получить, а если и получим что-то то это будет совсем не тот, объект, на который он указывает.

353
21 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: Green
С объектом все просто: если у него есть значение (внутреннее состояние), то он обязан его где-то хранить; если нет значения - то и хранить то нечего, но даже не смотря на это объект занимает место в памяти.
С ссылкой тоже все просто: ссылка не имеет значения (внутреннего состояния), т.е. ей и хранить то нечего.


Мы рассматриваем интерпретации ссылки или определение ссылки по стандарту? В стандарте, напомню, func() - это не имя.

Цитата: Green
Сколько это можно повторять, чтоб ты понял мою позицию?


Да, я понял твою позицию давно уже. Я покзываю что она далеко не точная. И не точнее моей.

Цитата: Green
Это не игра слов, а твое не желание (или не уменее) понять.
При ссылке: ссылка -> объект -> адрес(если надо)
При указателе: указатель-> адрес -> объект(если надо)


Что лишний раз доказывает правомерность трактовки ссылки как нечта хранящего адрес (как неявный указатель).

Кстати, ссылка не может ссылаться на объекты, адрес которых невозможно определить средствами языка. Что является еще одним доводом в пользу правомерности представления ссылки как хранящей адрес.
Вот например:

 
Код:
int* func()
{
    return new int(0);
}
int main()
{
    int*& a = func();
    int* b = a;
    return 0;
}

Почему я не могу написать так, раз 'a' это всего лишь другое имя?

Цитата: Green
Здесь ты инициализируешь ссылку объектом.
Я прошу проинициализировать адресом.


А почему я не могу интерпретировать что инициализирую ее адресом?

Цитата: Green
Куда и на что ссылается 'a'?
Ты можешь это понять без контекста?


Я вообще не понимаю что такое 'a' в данном случае. Только как это соотноситься с моим примером?

Цитата: Green
На объекты типа char. Один это объект или два сказать нельзя.


Единственная идентифицирующая информация об объекте перед инициализацией ссылки - это адрес, который возвращает фнукция в указателе.

Цитата: Green
Напрямую никак.


Что значит напрямую?

Цитата: Green
А зачем для этого трактовка. Это четко описано в стандарте.


Да, то-то ты выражение называешь именем, хотя в стандарте имя определено по другому. :)

Цитата: Green
Только ещё раз: ссылка ссылается не "куда", а "на что".


Это что-то, лежит где-то. Ссылаясь на что-то, мы ссылаемся куда-то.

Цитата: Green
1. В стандарте не сказано, что ссылку нельзя рассматривать, как имя, а даже наоборот.


В стандарте не сказано, что ссылку нужно рассматривать только как другое имя.
И встандарте имя определено как употребление идентификатора.

Цитата: Green
2. Альтернативное имя - это не идентификатор, так же как твой "неявный указатель" - это не указатель. Однако альтернативное имя куда больше похоже на имя, чем "неявный указатель" на указатель.


В стандарте не сказано, что ссылку нельзя рассматривать как нечто хранящее адрес (неявный указатель).
Итого: твое определение вводит новое понятие, мое определение вводит новое понятие. Значит они оба не верны с точки зрения стандарта? Или не точны?

Цитата: Green
Нет, как раз таки важно, т.к. ты перевираешь мои слова и приписывашь не мои высказывания. И по-моему, это уже о многом говорит.


Я делаю выводы из твоих слов. Поэтому, если это впечатление ошибочно, давай определимся, что тебя конкретно не устраивает, чтобы не возникало непоняток.

Цитата: Green
Видение, которое ты озвучиваешь, имеет рациональную основу.


Значит, разговор об адресе имеет право на жизнь.

Цитата: Green
Однако, многие источники указывают, что данная трактовка слишком упрощена и порой вводит в заблуждение.


Кто определяет что слишком? Кого вводит в заблуждение? Где вводит в заблуждение?
Это личное мнение автора.

Цитата: Green
А спор о том, что ты утверждаешь, что ссылка оперирует адресами.


Ты перевираешь мои слова. Я утверждаю что это одна из интерпретаций и она самая понятная. :)

Цитата: Green
Вот это предмет спора:


Да это интерпретация. Каждая интерпретация предполагает свою суть, однако поведение от этого не меняется. Я же не приписываю ссылке свое поведение.

Цитата: Green
Семантика же не с потолка свалилась. Если ссылку можно представлять, как нечто хранящее адрес, то было бы плохого, если бы можно было записать int&* ?


Потому что ссылка это не однозначное понятие (однозначного определения не существует) и ее можно по разному интерпретировать.

Цитата: Green
А ты свой "неявный указатель" ?


Как нечно содержащее адрес. А адрес есть в стандарте.
Но ты не уклоняйся. Ты по своему трактуешь имя или по стандарту?

Цитата: Green
В чем тут абсурд?
Это не абсурднее, чем говорить, что r то же самое, что *p.


Занчит твое определение ничуть не лучше чем мое.

Цитата: Green
Синоним адреса? А зачем мне синоним адреса, если я работаю с объектами? С++ - это ООП язык, который оперирует объектами, а не адресами, как, например, ассемблер.


Тебе не за чем, я же не призываю тебе им пользоваться. Адрес это информация об объекте, которая есть всегда. И имя ассоциируется с адресом.

Цитата: Green
А ссылка - это тоже синоним адреса?


Ссылка и имя это разные категории языка.

Цитата: Green
А зачем их так рассматривать?
Почему бы не рассматривать ссылки, просто, через ссылание (слово неправильное, введено специально) на объект ?
Зачем здесь ещё одна сущность - адрес?


Потому что у любого существующего объекта есть адрес и иногда это единственное что позволяет к нему обратиться.

Цитата: Green
Да именно так.


Т.е. мы будем отделять твое понятие имени от понятия имени по стандарту?

Цитата: Green
Я перечитал. Ты дал несколько определений:
...
Какое именно из них?
В любом случае каждое из них не дает представления, что же такое "неявный указатель".


Читай тут:
[QUOTE=Nixus]
Неявный казатель - это объект который представлен указателем и при обращении к которму происходит разименование этого указателя. Что позволяет получить доступ к некоторому объекту без применения операции разыменовывания (*,->,...) и без получения адреса при инициализации (&)
[/QUOTE]
Под объектом тут подразумевается сущность.

Цитата: Green
А если учесть вот это:
Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?
то вообще можно запутаться.


В альтернативных именах тоже можно запутаться. Пример уже приведен, где я не могу созать ссылку на объект.

Цитата: Green
Называется указателем, но указателем не является, не обладает интерфейсом указателя... но при этом автоматически разыменовывается и из этого вытекают какие-то свойства...


Бритва Оккама называется бритвой, но бритвой не является.

Цитата: Green
не использует принципы указателя


Это где же я такое говорил?

Цитата: Green
Может быть одно из свойств то, что этот указатель не оперирует адресами, т.к. вовсе не является указателем?


Не верное предположение.

Цитата: Green
А вот так вот и получилось.


Не понятно как?

Цитата: Green
Любое выражение, которое возвращает ссылку или является ссылкой, можно назвать альтернативным именем.


Любую сущность, которая позволяет обратиться к объекту в памяти можно назвать неявным указателем.

Цитата: Green
Я так понимаю, что это значит, что ты можешь задавать вопросы и критиковать мою трактовку, а я должен только отвечать и защищать свое мнение?


Это значит, что ты сам видишь, что твои аргументы не отличаются от моих. :)

Цитата: Green
Права критики и вопросов у меня нет?


Есть. Однако, не стоит утверждать, что твоя точка зрения правильнее, на основании того что она якобы общепринятая, т.к. созвучна с определениями, которые дают другие авторы.
Ты перебрал несколько трактовок уже. А я остаюсь в одной.

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

353
21 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
У указателя есть единственная операция - операция разыменовывания.


Как это соотноситься с тем, что ссылку можно представлять как нечно хранящее адрес?

Цитата: hardcase
Если применить ее к такому указателю (на объект в другом процессе), можно с большой вероятностью AV получить, а если и получим что-то то это будет совсем не тот, объект, на который он указывает.


Вот и покажи как в C++ создать такую ссылку, которая может, а указатель, при этом, не может.

ЗЫ. Если ты не знал, то к указателю применимы и другие операции (адресная арифметика, к примеру), и не каждый указатель можно разыменовать.

5
21 мая 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Nixus
Как это соотноситься с тем, что ссылку можно представлять как нечно хранящее адрес?

Ыыыыыы. Концептуально ссылка не хранит адрес. Хранение сервисной информации (указатель внутрях ссылки) - это уже детали реализации! К языку это имеет мало отношения.

Цитата: Nixus
Вот и покажи как в C++ создать такую ссылку, которая может, а указатель, при этом, не может.


В чистом C++ нельзя. В дотнетном можно.


Цитата: Nixus
ЗЫ. Если ты не знал, то к указателю применимы и другие операции (адресная арифметика, к примеру), и не каждый указатель можно разыменовать.

Плавали-знаем (я просто утрировал). А по поводу полезности адресной арифметики в повседневных задачах можно сильно поспорить...

3
21 мая 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Мы рассматриваем интерпретации ссылки или определение ссылки по стандарту? В стандарте, напомню, func() - это не имя.


А при чем именно тут стандарт?
Все твои аргументы теперь сводятся к следующему:
если в стандарте func() - не имя, то ты вообще все крутишь, как хочешь.
Мы говорили про то, хранит ссылка значение или нет, а не про то является ли func() именем по стандату.
Для чего ты пытаешься запутать обсуждение?

Цитата: Nixus

Что лишний раз доказывает правомерность трактовки ссылки как нечта хранящего адрес (как неявный указатель).


Не понял логики. Объясни пожалуйста.
Солнце встает на Востоке, что линий раз доказывает правомерность твоей трактовки? :D

Цитата: Nixus

Кстати, ссылка не может ссылаться на объекты, адрес которых невозможно определить средствами языка. Что является еще одним доводом в пользу правомерности представления ссылки как хранящей адрес.
Вот например:
 
Код:
int* func()
{
    return new int(0);
}
int main()
{
    int*& a = func();
    int* b = a;
    return 0;
}

Почему я не могу написать так, раз 'a' это всего лишь другое имя?


Потому, что ссылка не может ссылаться на временные объекты, т.к. время их жизни меньше, чем время жизни ссылки.
А вовсе не потому, можно взять адрес или нет.

Цитата: Nixus

А почему я не могу интерпретировать что инициализирую ее адресом?


Потому что адрес - это значение, а не объект.


Цитата: Nixus

Я вообще не понимаю что такое 'a' в данном случае. Только как это соотноситься с моим примером?


Это соотносится вот с этим:


Единственная идентифицирующая информация об объекте перед инициализацией ссылки - это адрес, который возвращает фнукция в указателе.


Еслиб ты инициализировал ссылку напрямую значением указателя, не было бы вопросов. Но ты разыменовываешь этот указатель и получаешь объект, которым уже инициализируешь ссылку.
Так при чем тут адрес?

Цитата: Nixus

Что значит напрямую?


Оперируя только ссылкой. А в общем случае вообще никак средствами языка.
Ты задал уже столько вопросов по этому своему примеру.
Может, покажешь сам чего ты хочешь добиться, чем пытаться загнать меня в ловушку.

Цитата: Nixus

Да, то-то ты выражение называешь именем, хотя в стандарте имя определено по другому. :)


А вот ты меня поймал... так поймал... прям ехидство зашкаливает...
Только ты забыл, что сам сказал, что мы говорим о трактовках и что твой "неявный указатель" ещё в большей степени не подходит под стандарт.

Цитата: Nixus

Это что-то, лежит где-то. Ссылаясь на что-то, мы ссылаемся куда-то.


И что?
Пусть лежит себе на здоровье где-то. Я ссылаюсь на объект, а не на адрес по которому он лежит.

Цитата: Nixus

Итого: твое определение вводит новое понятие, мое определение вводит новое понятие. Значит они оба не верны с точки зрения стандарта? Или не точны?


Они оба являются трактовками, а не определениями.

Цитата: Nixus

[QUOTE=Green]
Нет, как раз таки важно, т.к. ты перевираешь мои слова и приписывашь не мои высказывания. И по-моему, это уже о многом говорит.


Я делаю выводы из твоих слов. Поэтому, если это впечатление ошибочно, давай определимся, что тебя конкретно не устраивает, чтобы не возникало непоняток.
[/QUOTE]
В контексте моей фразы, под которой ты поставил свой вопрос, меня не устраивает что ты перевираешь мои слова и пытаешься т.о. предать негативную окраску всем моим постам.

Цитата: Nixus

Значит, разговор об адресе имеет право на жизнь.


Об адресе - нет. О "неявном указателе" - да.

Цитата: Nixus

Кто определяет что слишком? Кого вводит в заблуждение? Где вводит в заблуждение?
Это личное мнение автора.


Ну, например, тебя вводит в заблуждение с адресом.

Цитата: Nixus

Ты перевираешь мои слова. Я утверждаю что это одна из интерпретаций и она самая понятная. :)


Понятная, но неверная. Я могу принять трактовку с "неявным указателем", но вот с адресом не соглашусь.

Цитата: Nixus

Да это интерпретация. Каждая интерпретация предполагает свою суть, однако поведение от этого не меняется. Я же не приписываю ссылке свое поведение.


Не приписываешь намрянно, но употребляя слово "указатель" вводишь в ряд заблуждений, одним из которых является адрес.
Согласен, трактовка через альтернативное имя имеет нестройность в части касающейся func(), однако здесь можно принять, что именем будет все выражение возвращающее ссылку и имя это как и имя любого объекта актуально только пока актуален этот объект. Я не вижу чему это может помешать.

Цитата: Nixus

Как нечно содержащее адрес. А адрес есть в стандарте.
Но ты не уклоняйся. Ты по своему трактуешь имя или по стандарту?


Альтернативное имя я трактую по своему.
Только к чему этот вопрос, если "неявный указатель" ты тоже трактуешь по своему, а не по стандарту?

Цитата: Nixus

Занчит твое определение ничуть не лучше чем мое.


См выше.

Цитата: Nixus

Тебе не за чем, я же не призываю тебе им пользоваться. Адрес это информация об объекте, которая есть всегда. И имя ассоциируется с адресом.


Имя ассоциируется с объектом, а не с адресом. В этом и основной наш спор.

Цитата: Nixus

Ссылка и имя это разные категории языка.


Это как? Объясни.
И ответь все же на вопрос: А ссылка - это тоже синоним адреса?

Цитата: Nixus

Потому что у любого существующего объекта есть адрес и иногда это единственное что позволяет к нему обратиться.


И при чем тут ссылка?
Хоть убей не вижу связи между адресом и ссылкой.

Цитата: Nixus

Т.е. мы будем отделять твое понятие имени от понятия имени по стандарту?


А что по поводу твоего указателя?
Будем отделать или нет?
Что за дурацкая манера, утверждать о своих высказываниях, как о трактовке, что они т.о. не завязаны четко на стандарт и тут же пытаться жестко привязать мои трактовки к стандарту.
Соблюдай правила игры, которые сам же и устанавливаешь.

Цитата: Nixus

Читай тут:
Под объектом тут подразумевается сущность.


Ладно, я проглочу, что под объектом понимается сущность и даже что сущность эта "представлена указателем" (который является объектом).
Но скажи, это полное твое определение? А как же нюансы отличающие "неявный указатель"-сущность от указателя-объекта, коим представлена? Из этой вормулировки, получается, что я могу оперировать ссылкой, как указателем. Так?
И ещё интересная фраза присутствует в этом определении: "и без получения адреса при инициализации".
Значит все же без адреса?

Цитата: Nixus

В альтернативных именах тоже можно запутаться. Пример уже приведен, где я не могу созать ссылку на объект.


Смотри "наш ответ Чемберлену".

Цитата: Nixus

Бритва Оккама называется бритвой, но бритвой не является.


Тогда зачем её называть бритвой?

Цитата: Nixus

Это где же я такое говорил?


Вот упоминаются принципы:

Цитата:

Где я говорю что у указателя и неявного указателя одинаковый интерфейс или принципы использования?


А... я понял, ты не говорил ни того ни другого... ни что используют принципы, ни что НЕ используют.
Тогда вопрос: так используют или нет?

Цитата:

Не верное предположение.


Значит, он оперирует адресами?

Цитата:

Любую сущность, которая позволяет обратиться к объекту в памяти можно назвать неявным указателем.


Э... а почему бы не ссылкой.
Это было бы корректнее. Хотя бы потому, что не надо было бы добавлять, что этот указатель неявно разыменовывается, не является объектом и еще пунктов 10 несоответсвий и нюансов.

Цитата:

Есть. Однако, не стоит утверждать, что твоя точка зрения правильнее, на основании того что она якобы общепринятая, т.к. созвучна с определениями, которые дают другие авторы.


Я утверждаю и этим В ТОМ ЧИСЛЕ.

Цитата:

Ты перебрал несколько трактовок уже. А я остаюсь в одной.


Да у меня одна трактовка, просто пытаюсь донести её по разному.
Кстати, заметь, я ни разу не предрался, что ты привел уже несколько трактовок, хотя различных форм было несколько. Не так ли?

Цитата:

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


Ты - можешь.
А я бы не представлял. Зачем мне представлять что-то и так понятное, через механизмы, которые внутри неоднозначны.
Ведь реализация ссылки неоднозначна. С этим то ты спорить не будешь?

5
21 мая 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Nixus
Потому что у любого существующего объекта есть адрес и иногда это единственное что позволяет к нему обратиться.

А если объект находится в регистре? У него тоже есть адрес? :D

Цитата: Nixus
Любую сущность, которая позволяет обратиться к объекту в паымяти можно назвать неявнм указателем.

Ну, скажем все зависит от модели исполнения программы... В CLR например используется механизм с индексами локальных переменных и есть специальные инструкции доступа к ним - там ни слова об адресах нету.

353
21 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
Ыыыыыы. Концептуально ссылка не хранит адрес.


Дай мне определение ссылки.

Вот не знаю как соотнести:

Цитата: hardcase
Хранение сервисной информации (указатель внутрях ссылки) - это уже детали реализации! К языку это имеет мало отношения.


и

Цитата: hardcase
В чистом C++ нельзя. В дотнетном можно.


Мы говорим о C++ или о реализации. Ты уж определись, что ли?
И что такое чистый C++?

Цитата: hardcase
Плавали-знаем (я просто утрировал).


Так ты не утрируй, а выражайся четко. Что ты хотел показать наличаем у указателя операции разыменования?

Цитата: hardcase
А по поводу полезности адресной арифметики в повседневных задачах можно сильно поспорить...


Кто говорил о "полезности адресной арифметики в повседневных задачах"? Хочешь поговорить - заводи отдельную тему.

353
21 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
А если объект находится в регистре? У него тоже есть адрес? :D


RTFM - читай стандарт и что там написано про переменные. Или перечитай наш диалог с Green'ом.

Цитата: hardcase
Ну, скажем все зависит от модели исполнения программы... В CLR например используется механизм с индексами локальных переменных и есть специальные инструкции доступа к ним - там ни слова об адресах нету.


Адрес - это индекс байта в памяти, а память может быть любой. Ты уж определись на каком уровне мы разговариваем: стандарт или реализация?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог