Здравствуйте, DarkGray, Вы писали:
DG>> можем ли мы одновременно использовать две модели: одна которая утверждает что это идентичные объекты, а другая — что это разные? DG>> или другими словами: можем ли мы использовать модель — которая в одной части утверждений считает, что это идентичные объекты, а в другой части утверждений считает, что это неидентичные объекты?
DG>если не можем, то почему?
По определению. Я приводил определение идентичности. Оно устроено так, что идентичность может быть только одна. Если есть два отношения, I1 и I2, при этом одно из отношений различает объекты o1 и o2, а второе — нет, то второе не является идентичностью. В лучшем случае оно является отношением эквивалентности.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали:
S>Уточни, пожалуйста, оно говорит о каких-то конкретных случаях объявления ссылки, или о всех, включая объявление ссылки на локальную переменную?
О всех кроме ссылок являющихся "non-static data member".
DG>>так я тебе сразу говорил, что про эквивалентность можно лишь говорить на каком-то наборе операций, и что стоит это сразу оговаривать. В данном случае, ты рассматриваешь эквивалентность лишь на наборе безопасных операций. S>Давайте введём в студию формальное определение "эквивалентности на наборе операций". Лично мне это словосочетание непонятно. S>Для эквивалентности необходимо и достаточно ровно одной операции: процедуры сравнения объектов.
стыдно должно быть — этого малого, еще как минимум, необходимо то, что сравнивается на эквивалентность.
давай фиксировать — а что же мы сравниваем.
возьмем задачу эквивалентности переменных и ссылок (назовем их элементами).
при этом мы сравниваем эквивалентность их поведения:
берем переменную и ссылку в одинаковом(эквивалентном) состоянии,
берем какую-нибудь операцию над переменной (и подобную ей над ссылкой) и применяем, получая результат для переменной и ссылки,
далее сравниваем результаты на одинаковость(эквивалентность).
дальше рассматриваем применение всех таких операций для всех состояний — если одинаковость(эквивалентность) всегда сохранялась, значит мы делаем вывод, что поведение данных элементов эквивалентно
соответственно алгоритм проверки эквивалентности поведения двух элементов потребовал:
функцию проверки эквивалетности состояния двух элементов
набор пар операций (для одного элемента и соответствующей ей для другого элемента)
вот эту штуку мы можем назвать: эквивалентность на наборе операций (или более строже: эквивалентность поведения элементов X и Y на наборе операций Z с функцией эквивалентности между элементами E(X,Y))
Здравствуйте, igna, Вы писали:
I>Здравствуйте, samius, Вы писали:
S>>Уточни, пожалуйста, оно говорит о каких-то конкретных случаях объявления ссылки, или о всех, включая объявление ссылки на локальную переменную?
I>О всех кроме ссылок являющихся "non-static data member".
Да, ты прав. Теперь прав (спустя 25 лет существования ссылок). тыц. тыц, тыц...
Теперь референсы формально считаются переменными, невзирая на то, что память для хранения значения может и не выделиться. И просто потому что так меньше исправлять в стандарте.
S>Теперь референсы формально считаются переменными, невзирая на то, что память для хранения значения может и не выделиться. И просто потому что так меньше исправлять в стандарте.
т.е. ты предлаешь написать в стандарте, что ссылка может является переменной, а может нет?
S>>Теперь референсы формально считаются переменными, невзирая на то, что память для хранения значения может и не выделиться. И просто потому что так меньше исправлять в стандарте.
DG>т.е. ты предлаешь написать в стандарте, что ссылка может является переменной, а может нет?
нет, я поражаюсь, как легко можно изменить терминологию, устоявшуюся десятилетиями.
DG>давай фиксировать — а что же мы сравниваем. DG>возьмем задачу эквивалентности переменных и ссылок (назовем их элементами). DG>при этом мы сравниваем эквивалентность их поведения:
Ключевое слово, пропущенное ранее, выделено. Дальнейшее, конечно же, понятно.
С точностью до ошибок (или нестрогостей)
Ну, вот к примеру:
берем какую-нибудь операцию над переменной (и подобную ей над ссылкой) и применяем, получая результат для переменной и ссылки
К кому из элементов мы применяем эту операцию?
DG>вот эту штуку мы можем назвать: эквивалентность на наборе операций (или более строже: эквивалентность поведения элементов X и Y на наборе операций Z с функцией эквивалентности между элементами E(X,Y))
Ну, вот теперь всё становится более-менее понятным.
Давайте теперь попробуем всё же нарисовать пример, в котором нарушается эквивалентность поведения между a и a1:
int a = 1;
int &a1 = a;
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, igna, Вы писали:
I>На самом деле здесь три объекта, поскольку указатель тоже объект. Переменных здесь две (одна из них ссылочная). Цитата из стандарта:
Ок, без проблем. Тем не менее, количество переменных и количество объектов не совпадают, какие бы мы терминологические ухищрения ни принимали.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
S>Ну, вот теперь всё становится более-менее понятным. S>Давайте теперь попробуем всё же нарисовать пример, в котором нарушается эквивалентность поведения между a и a1: S>
S>int a = 1;
S>int &a1 = a;
S>
на вскидку должны быть эквивалентны, но из эквивалентности переменной и ссылки на одном примере не следует, что ссылка и переменная эквиваленты всегда.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, samius, Вы писали:
S>>нет, я поражаюсь, как легко можно изменить терминологию, устоявшуюся десятилетиями.
I>Э нет, тут как раз наконец-то в стандарте прописали терминологию, устоявшуюся десятилетиями, а именно термин reference variable.
В стандарте такой термин не упоминается.
A reference variable is an alias, that is, another name for an already existing variable. Once a reference is initialized with a variable, either the variable name or the reference name may be used to refer to the variable.
C++ references allow you to create a second name for the a variable that you can use to read or modify the original data stored in that variable.
...
When a reference is created, you must tell it which variable it will become an alias for.
As soon as we declare a variable, the amount of memory needed is assigned for it at a specific location in memory (its memory address). We generally do not actively decide the exact location of the variable within the panel of cells that we have imagined the memory to be — Fortunately, that is a task automatically performed by the operating system during runtime. However, in some cases we may be interested in knowing the address where our variable is being stored during runtime in order to operate with relative positions to it.
The address that locates a variable within memory is what we call a reference to that variable. This reference to a variable can be obtained by preceding the identifier of a variable with an ampersand sign (&), known as reference operator, and which can be literally translated as "address of".
DG>>давай фиксировать — а что же мы сравниваем. DG>>возьмем задачу эквивалентности переменных и ссылок (назовем их элементами). DG>>при этом мы сравниваем эквивалентность их поведения: S>Ключевое слово, пропущенное ранее, выделено. Дальнейшее, конечно же, понятно.
специфицируй тогда эквивалентность каких объектов ты сравнивал и с помощью какой процедуры. а то пальцем тыкать каждый может..
Здравствуйте, DarkGray, Вы писали:
DG>на вскидку должны быть эквивалентны, но из эквивалентности переменной и ссылки на одном примере не следует, что ссылка и переменная эквиваленты всегда.
Такого утверждения никто не делал. Зачем вы пытаетесь его опровергать?
Вам дали пример того, как у одной переменной появляется два имени. А вы начинаете махать шашкой и рассказывать, как невозможно моделировать реальные автомобили при помощи ООП из-за того, что в реальном мире вопрос идентичности автомобилей крайне запутан.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
DG>специфицируй тогда эквивалентность каких объектов ты сравнивал и с помощью какой процедуры. а то пальцем тыкать каждый может..
Я утверждал, что после такого определения a и a1 не существует способа написать функцию двух аргументов сompare(), которая бы вернула true, если в неё переданы a и a, и false, если в неё переданы a и a1.
При этом можно проводить любые манипуляции с a и/или a1, оставаясь в рамках языка.
Текстовые игры, типа препроцессора, запрещены — т.е. мы сначала натравливаем на программу препроцессор, а потом смотрим, удовлетворяет ли нас исходник.
То есть вот такое "очевидное" решение не проходит:
bool compare(int x, int y)
{
return (x == y);
}
int a = 1;
int &a1 = a;
#define a1 0
cout << compare(a, a1)
Всё это имеет целью доказать, что a1 — это ещё одно имя (алиас) для a, а не новая отдельная переменная (да, это противоречит терминологии нового стандарта, как мы уже выяснили в соседней ветке)
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, DarkGray, Вы писали:
DG>там же написано: операций пара: одна над переменной F(X) другая подобная над ссылкой F(Y) DG>соответственно: DG>F(X) применяется к X, а F(Y) применяется к Y
В таком случае пример с x.y.z некорректен — где вторая операция?
На самом деле, "эквивалентности поведения", определённого таким образом, для целей нашей дискуссии недостаточно.
При таком определении легко доказать, что такие две переменные эквивалентны:
int a = 1;
int a1 = a;
Тем не менее, уже интуитивно понятно, что ссылка a1 ближе к переменной a.
А если подходить формально, то из идентичности следует возможность применять несимметричные операции к сравниваемым элементам, и всё ещё иметь эквивалентность поведения.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, DarkGray, Вы писали:
DG>>на вскидку должны быть эквивалентны, но из эквивалентности переменной и ссылки на одном примере не следует, что ссылка и переменная эквиваленты всегда. S>Такого утверждения никто не делал. Зачем вы пытаетесь его опровергать?
некто Sinclair делал: S> Я обещал эквивалентность имён a1 и a2, при условии, что имя a2 определено как ... & a2 = a1.
S>Вам дали пример того, как у одной переменной появляется два имени.
да, пусть будет.
мне лишь не нравится, что ты:
1. употребляешь термин alias для ссылки, не обозначая границ, когда ссылку можно считать alias-ом, а когда нет.
2. отрицаешь, что ссылка — это нечто большее, чем имя. и что она является объектом.
DG>специфицируй тогда эквивалентность каких объектов ты сравнивал и с помощью какой процедуры. а то пальцем тыкать каждый может..
S> Я утверждал, что после такого определения a и a1
соглашусь, если добавить все границы, а именно, что переменная и ссылка должна быть объявлены в одном блоке, и тип ссылки должен быть равен типу самой переменной (с точностью до ссылочности)
ты еще что-то утверждал про a и x.y.z — это утверждение хотелось бы увидеть специфицированным.
и также есть какое-то утверждение, что ссылка является алиасом и на это тоже хочется видеть спецификацию.
S> При таком определении легко доказать, что такие две переменные эквивалентны
если речь идет об эквивалентности переменной и ссылки на эту же переменную, то все твои замечания признаю.
я когда вводил "эквивалентность на наборе операций" чуть другое имел ввиду.
тогда да, нам кроме эквивалентности поведения (что вместо одного элемента мы можем подставлять(использовать) другой), еще необходимо потребовать одинаковость состояния переменной и ссылки в любой момент времени(или более формально, что после любой операции(из заданного набора операций) над переменной или ссылкой состояния должны быть одинаковыми).
Здравствуйте, Sinclair, Вы писали:
S>Ок, без проблем. Тем не менее, количество переменных и количество объектов не совпадают, какие бы мы терминологические ухищрения ни принимали.
Зато в случае использования терминологии стандарта C++ совпадают понятия переменная и имя переменной. Это как раз тот случай когда (имя переменной == переменная) && (переменная != объект), и твое сообщение здесь
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Sinclair, Вы писали:
S>>Ок, без проблем. Тем не менее, количество переменных и количество объектов не совпадают, какие бы мы терминологические ухищрения ни принимали.
I>Зато в случае использования терминологии стандарта C++ совпадают понятия переменная и имя переменной.
Не совпадают. Иначе бы в стандарте так и написали, что это одно и то же. Там же написано что объявление ссылки вводит переменную. Из чего никак не делается вывод что это одно и то же.