1) Этот результат не указан.
2) Этот результат не указан. *
3) Да.
Соответствующий раздел в стандарте - §5.9 / 2. Реляционные сравнения между указателями p
и q
указываются только тогда, когда:
p
и q
указывают на один и тот же объект или функцию, указывают на один конец конца одного и того же массива, или оба имеют нулевое значение. В этом случае p <= q
и p >= q
являются истинными, а p < q
и p > q
ложными.
p
и q
указывают на нестатические элементы данных одного и того же объекта, указатель на объявленный позже элемент сравнивается больше. (Обратите внимание, что это сравнение не может быть между спецификаторами доступа.)
p
и q
указывают на элементы в одном и том же массиве или на один конец конца массива, указатель на элемент с более высоким индексом или на один конец конца массива сравнивается больше.
p
и q
указывают на элементы данных одного и того же объекта объединения, и в этом случае они сравниваются одинаково.
Во всех остальных случаях результат не указан.
* Поскольку они статичны, они (очевидно) не получают правил "нестатического члена". Они будут определены в некоторой единице перевода, и, следовательно, как и любой другой указатель. (Неопределенные.)
Примечание! Существует способ получить общее упорядочение, используя std::less<void*>
(и все другие объекты сравнительных функций.)
Это в §20.3.3 / 8:
Для шаблонов greater
, less
, greater_equal
и less_equal
, специализации для любого
Тип указателя выдает суммарный порядок, даже если встроенные операторы <
, >
, <=
, >=
не делают.
Так что, пока вы не знаете, std::less<void*>(&gFirst, &gSecond)
равно true
или false
, вам гарантировано:
std::less<void*>(&gFirst, &gSecond) ==
std::greater<void*>(&gSecond, &gFirst);
std::less<void*>(&Data::First, &Data::Second) ==
std::greater<void*>(&Data::Second, &Data::First);
Что может оказаться полезным.