Будет ли "& a + 1> & a" вызывать поведение undefined
Гарантирует ли c99/c++03, что &a+1 > &a всегда верно?
например, существует (c-like) std::copy и
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
Всегда ли это работает?
Ответ 1
Да, C99 имеет специальную формулировку, чтобы сказать, что при работе с адресами любой данный объект a будет действовать как массив из 1 элемента, так что &a+1 будет действительным (§6.5.6/7):
Для этих операторов указатель на объект, который не является элементом массив ведет себя так же, как указатель на первый элемент массива длиной один с тип объекта как его тип элемента.
Хотя номер раздела отличается (§6.3.6), C90 дает такое же требование.
С++ имеет то же требование в §5.7/4 (тот же номер раздела в С++ 03 и С++ 11).
В С++ вы можете сравнивать адреса произвольных объектов (одного и того же типа) с помощью std::less, даже если встроенный оператор < не даст значимых результатов (например, два объекта, которые не являются частями одного и того же массив) (§20.8.5/7):
Для шаблонов greater, less, greater_equal и less_equal специализации для любого типа указателя дают полный порядок, даже если встроенные операторы <, > , < =, >= do not.
Также обратите внимание, что хотя вы можете сформировать эти адреса и можете сравнивать их с адресом объекта, вы не можете разыменовать эти указатели (ну, компилятор, вероятно, не остановит вас, если вы попытаетесь, но результат будет undefined).
Ответ 2
Да, это гарантировано на С++ (не знаю о C). Специфика заключается в том, что переменная типа T эквивалентна массиву одного элемента того же типа, и вы всегда можете получить указатель за пределами массива.