Pointer relationalen Operatoren definieren nicht einen Gesamtauftrag (§ 5.9 of the C++11 standard):Wie funktioniert `std :: less`?
Wenn zwei Zeiger
p
undq
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 vonp<q
,p>q
,p<=q
undp>=q
nicht spezifiziert.
std::less Dokumentation sagt:
Die partielle Spezialisierung der
std::less
für jeden Zeigertyp einen Gesamtauftrag ergibt, auch wenn die eingebaute inoperator<
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;
};
Vielen Dank, Ihre Antwort ist perfekt. Ist Ihnen jedoch eine Implementierung von 'operator
rom1v
@ 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
Ich bin mir nicht sicher, ob es noch existiert. Vieles davon kam aus den Tagen der nahen und fernen Zeiger. – Nevin