Будет ли "&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 эквивалентна массиву из одного элемента того же типа, и вы всегда можете получить указатель за концом массива.

Другие вопросы по тегам