Pointer operatori relazionali non definiscono un ordinamento totale (§ 5.9 of the C++11 standard):Come funziona `std :: less`?
Se due puntatori
p
eq
dello stesso punto a diversi oggetti che non sono membri di uno stesso oggetto o elementi dello stesso vettore o tipo a diverse funzioni o se solo una di esse è null, i risultati dip<q
,p>q
,p<=q
ep>=q
non sono specificati.
std::less documentazione dice:
La specializzazione parziale di
std::less
per qualsiasi tipo puntatore produce un ordine totale, anche se il built-inoperator<
non lo fa.
Come si ottiene questo ordine totale da un ordine parziale?
non sono in grado di rispondere a questa domanda, cercando in /usr/include/c++/4.9/bits/stl_function.h
per struct less
definizioni:
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;
};
Grazie, la tua risposta è perfetta. Tuttavia, sei a conoscenza di un'implementazione di 'operator <' che non fornisce un ordine totale? In che modo l'implementazione di 'std :: less' produce un ordine totale al di fuori di esso? – rom1v
@ rom1v Non sono a conoscenza dell'esistenza di tale implementazione.Sono abbastanza sicuro che esista, considerando quanto attentamente il comitato standard decida cosa vada come requisito e cosa vada come * comportamento non specificato *. – Shoe
Non sono sicuro che esista ancora. Molto di questo è venuto dai giorni di puntatori vicini e lontani. – Nevin