2015-06-03 9 views
6

Pointer relationalen Operatoren definieren nicht einen Gesamtauftrag (§ 5.9 of the C++11 standard):Wie funktioniert `std :: less`?

Wenn zwei Zeiger p und q des gleichen Typs Punkt an verschiedene Objekte, die nicht Mitglieder des gleichen Objekts oder Elemente desselben Array sind oder zu verschiedenen Funktionen, oder wenn nur eine von ihnen null ist, sind die Ergebnisse von p<q, p>q, p<=q und p>=q nicht spezifiziert.

std::less Dokumentation sagt:

Die partielle Spezialisierung der std::less für jeden Zeigertyp einen Gesamtauftrag ergibt, auch wenn die eingebaute in operator< nicht.

Wie ergibt es diese Gesamtbestellung aus einer Teilbestellung?


ich nicht in der Lage bin, diese Frage zu beantworten, indem sie auf /usr/include/c++/4.9/bits/stl_function.h für struct less Definitionen suchen:

template<typename _Tp = void> 
    struct less; 

    template<typename _Tp> 
    struct less : public binary_function<_Tp, _Tp, bool> 
    { 
     bool 
     operator()(const _Tp& __x, const _Tp& __y) const 
     { return __x < __y; } 
    }; 

    template<> 
    struct less<void> 
    { 
     template <typename _Tp, typename _Up> 
     auto 
     operator()(_Tp&& __t, _Up&& __u) const 
     noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) 
     -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u)) 
     { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); } 

     typedef __is_transparent is_transparent; 
    }; 

Antwort

4

Wie ergeben sie diesen Gesamtauftrag von einem Teilauftrag?

Der Standard sagt selten wie etwas erreicht werden sollte. Stattdessen sagt es, was erforderlich ist. Und genau das ist der Fall. Der Standard erfordert std::less insgesamt zu versehen, in §20.9.6/14:

Für Vorlagen größer, kleiner, greater_equal und less_equal, die Spezialisierungen für jeden Zeigertyp einen Gesamtauftrag ergeben, auch wenn die eingebaute Operatoren <,>, < =,> = nicht.

während operator< ‚s Verhalten in dieser Hinsicht ist nicht spezifiziert nach §5.9/4 (das Zitat Sie in Ihrer Frage haben).

Keine Angabe Verhalten in §1.3.25 bedeuten definiert:

Verhalten, für ein wohlgeformtes Programm Konstrukt und korrekte Daten, die auf der Implementierung abhängt [...]

In Ihrer spezifischen Implementierung liefert operator< bereits eine Gesamtbestellung (wahrscheinlich, weil Ihr Zeigertyp als eine 32-Bit- oder 64-Bit-Adresse implementiert ist, die leicht als etwas ähnlich einer vorzeichenlosen Ganzzahl interpretiert werden kann). daher std::less leitet seine Argumente einfach an diesen Operator weiter.

+0

Vielen Dank, Ihre Antwort ist perfekt. Ist Ihnen jedoch eine Implementierung von 'operator rom1v

+0

@ rom1v Ich bin mir der Existenz solcher Implementierung nicht bewusst.Ich bin mir ziemlich sicher, dass es existiert, wenn man bedenkt, wie sorgfältig das Standardkomitee entscheidet, was als Anforderung gilt und was als * nicht spezifiziertes Verhalten * gilt. – Shoe

+1

Ich bin mir nicht sicher, ob es noch existiert. Vieles davon kam aus den Tagen der nahen und fernen Zeiger. – Nevin