Если вы хотите рассматривать указатели как числовой тип, сначала вам нужно использовать std::uintptr_t
, а не long
. Это первое неопределенное поведение, но не то, о котором вы говорите.
Он работает в нескольких компиляторах, которые я пробовал, но это неопределенное поведение.
Вопрос: почему?
Хорошо, поэтому раздел комментариев отключился, когда я вызвал это неопределенное поведение. Это на самом деле неопределенное поведение (a.k.a. реализация определена ).
Вы пытаетесь сравнить два явно не связанных указателя:
Указатель &x+1
- это указатель один за другим . Стандарт позволяет вам иметь такой указатель, но поведение определяется только при его использовании для сравнения с указателями на основе x
. Поведение не указано , если сравнить его с чем-либо еще: [expr.eq & sect; 3,1]
Компилятор может поместить y
куда угодно, в том числе в регистр. Таким образом, нет никакой гарантии, что &y
и &x+1
связаны между собой.
В качестве упражнения для того, кто хочет показать, является ли это фактически неопределенным поведением или нет, возможно, начните здесь: