Может скажешь почему они должны быть равны?
If the pointers are pointers to object and represent the same address, they compare equal https://en.cppreference.com/w/cpp/language/operator_comparison
UB
А можно пруф пожалуйста?
А на что по вашему указывает &x + 1 в общем случае?
А какая разница? Арифметика указателей вроде не запрещена. Указатель не был разыменован, не уверен в уб при попытке получить произвольный адрес
Первый из двух не pointer to the object, а past the end
Хммм... Past the end чего? Объекта?
Для этой части переменная не типа массива рассматривается как массив из одного элемента
Звучит логично, спасибо
Логика стандарта в этой части допускает сегментированную память и не обещает сравнение указателей, как и ничего не обещает про преобразование в uintptr_t
Хорошо, оптимизатор компилятора исходит из того, что x и y это совершенно два разных объекта int, находящихся в совершенно разных областях памяти, и следовательно предполагается, что &x + 1 никогда не будет равен y и выполняется оптимизация сравнения
Странный ты...
Там сравнение, это аналогично разименованию. К тому же, с чего ты взял что - две автоматические переменные лежат в смежных адресах - адрес переменной, обыденной ранее, меньше. Ты не спец по комп. Безопасности случайно? Они всё какие...
Сравнение с нулевым указателем тоже аналогично разыменованию нулевого указателя? Интересное заявление Я взял это с того, что они действительно лежат в смежных адресах, потому что проверено ассертом. Я не утверждал, что они *обязаны* лежать в смежных адресах, но в конкретном кейсе, где они лежат, указатели не оказывались не равны, хотя адреса совпадали И это уже объяснили более логично чем "да просто уб", так что мой запрос пруфов считаю оправданным
Оптимизатор думает иначе, и все тут
Они и без оптимизатора не должны быть равны, уже выяснили
А это напрямую в стандарте есть, поэтому вот так...
И я почему-то странный, когда прошу ссылку на стандарт, ну
Они не аналогичны конечно, я имел в виду, что по эффекту выхода указателя за границы памяти объекта они аналогичны. В смысле UB UB. Кстати, сравнивать два указателя на разные объекты на что-то кроме == тоже нельзя
Читай CPR, он проще, а суть та же
Насколько я знаю, выход за границы чего-либо указателем уб не является, только разыменование такого указателя
Нет, я про это и пишу
такой указатель даже нельзя сформировать, не то что разыменовать http://eel.is/c++draft/expr.add#4.3
Вот, то что надо. Спасибо большое!
Так это логично было
Нет, это так не работает в C++
Как бы логично не казалось, важно только то как это описано/не описано в стандарте
стандарт это лишь формулировки некой коллективной C++ mental model, которые достаточно точны и непротиворечивы, чтобы быть утвержденными это не значит, что они хорошо отражают изначальную идею или покрывают все крайние случаи. поэтому mental model за стандартом как минимум не менее важна, чем сам текст
Ну извини, я вот лично гулял с телефоном, не мог тебе так быстро ссылку на стандарт прислать... Но так — CPR гораздо лучше. https://en.cppreference.com/w/cpp/language/operator_comparison
Вот чё написал? ЧТО МОЖЕТ БЫТЬ ВАЖНЕЕ СВЯТЕЙШЕГО СТАНДАРТА и пророка его Стровстропа ?
Баги компилятора и не до конца реализованный стандарт
Раз уж пошла пьянка про указатели и спецификаторы к ним Можно заткнуть компилятор добавив спецификатор volatile к указателям В таком случае компилятор не имеет права трогать программу
UB останется, но компилятор заткнется
Обсуждают сегодня