Есть ли c99/c++03
гарантировать, что &a+1 > &a
всегда верно?
например, есть (c-like) std::copy
, а также
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
Это всегда работает?
Да, 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 эквивалентна массиву из одного элемента того же типа, и вы всегда можете получить указатель за концом массива.