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