Uwaga: to pytanie nie dotyczy zamówienia całkowitego. Całkowite zamówienie na wskaźniki tego samego typu można uzyskać za pomocą std::less
.Czy operator <(mniej niż) na wskaźnikach jest zgodny?
According to this, porównanie dwóch wskaźników z operator<
jest niedozwolone, jeśli wskazują one na przykład na różne alokacje.
W jakim sensie nie jest to dozwolone? Czy jest to zdefiniowane przez implementację, nieokreślone lub niezdefiniowane zachowanie?
Chyba czytałem gdzieś, że jest nieokreślone. Implementacja nie jest wymagana do udokumentowania tego, co to jest zachowanie, ale musi być pewne zachowanie. Oznaczałoby to, że porównywanie dowolnych dwóch wskaźników jest nadal zgodne z prawem, ale niekoniecznie daje całkowitą kolejność. Czy to oznacza, że wciąż musimy uzyskać spójny wynik, porównując dwa razy te same wskaźniki? Ogólny przypadek: czy wywołanie tego samego nieokreślonego zachowania dwa razy w aplikacji zawsze daje taki sam wynik?
int i1, i2;
int* a = &i1;
int* b = &i2;
bool b1 = a < b; // unspecified, right?
bool b2 = a < b;
assert(b1 == b2); // Is this guaranteed to be true?
Czy masz konkretnego odniesienia, który mówi, że jest to undefined * *? Czytając * [expr.rel] *, rozumiem, że jest * nieokreślony *. – Holt
[tutaj] (http://eel.is/c++draft/expr.rel # 3), mówi w trzecim punkcie, że _W przeciwnym razie żaden ze wskaźników nie porównuje więcej niż drugi_. To nie jest dokładnie UB. Czy się mylę? – skypjack
Z połączonej odpowiedzi SO: "Można jednak użyć std :: less, a inne obiekty funkcji porównywania relacyjnego porównywać dowolne dwa wskaźniki. Wyniki są definiowane przez implementację, ale gwarantuje się całkowitą kolejność." –