2015-06-03 9 views
6

Pointer operatori relazionali non definiscono un ordinamento totale (§ 5.9 of the C++11 standard):Come funziona `std :: less`?

Se due puntatori p e q 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 di p<q, p>q, p<=q e p>=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-in operator< 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; 
    }; 

risposta

4

Come ci si riporterà questo elemento totale da un ordine parziale?

Lo standard dice raramente come deve essere eseguito lo standard. Invece, dice ciò che è richiesto. E questo è esattamente il caso. Lo standard è che richiedono std::less per fornire un ordine totale, in §20.9.6/14:

Per i modelli più, meno, greater_equal, e less_equal, specializzazioni per qualsiasi tipo puntatore producono un ordine totale, anche se il operatori integrati <,>, < =,> = no.

mentre il comportamento s' operator< in questo senso è specificato in base alla §5.9/4 (la citazione che hai nella tua domanda).

comportamento Unspecified è definita §1.3.25 significare:

comportamento, per un costrutto ben formata programma e dati corretti, che dipende dall'implementazione [...]

Nell'implementazione specifica, operator< fornisce già un ordine totale (probabilmente perché il tipo di puntatore è implementato come indirizzo a 32 bit o 64 bit, che può essere facilmente interpretato come qualcosa di simile a un intero senza segno, con un ordine totale), quindi std::less inoltra semplicemente i suoi argomenti a quell'operatore.

+0

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

+0

@ 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

+1

Non sono sicuro che esista ancora. Molto di questo è venuto dai giorni di puntatori vicini e lontani. – Nevin

Problemi correlati