È C
utilizzabile in algoritmi standard come std::sort
che attualmente utilizza l' <
operatore predefinito?
Sì, funziona per std::sort()
e alcuni altri algoritmi standard. Il codice
#include <algorithm>
#include <vector>
struct C
{
/* Class contents, without any arithmetic operator... */
constexpr operator int() noexcept {return 0;} // Implicit conversion to int
};
int main()
{
std::vector<C> v;
std::sort(begin(v), end(v));
}
compila. Here's a live demo. Guarda però la prossima domanda!
È il C
considerato soddisfacente il concetto LessThanComparable
?
No. I requisiti del concetto LessThanComparable
sono, che per gli oggetti x
e y
di tipo C
o const C
l'espressione x<y
è valido e conversione implicita bool e l'operatore <
stabilisce una stretta relazione debole ordinamento. Nel tuo caso, gli oggetti const non verranno convertiti in int
s. Questo è un bug nel tuo codice, perché non è const corretto. L'aggiunta della parola chiave const
funzionerà e la classe C
sarà effettivamente LessThanComparable
. Il severo rapporto di ordinamento debole è soddisfatto, perché gli standard int
soddisfano questo requisito.
Will C
soddisfare le esigenze di una ipotetica conceptified algoritmo biblioteca che richiedono il tipo di essere LessThanComparable
.
Se si risolve il problema, sì, lo farà.
Poche note a margine:
GCC 4.9 compila x<y
anche se x
e y
sono di tipo const C
. Questo sembra essere un bug del compilatore, dal momento che GCC 5.2 e clang 3.6 generano un errore di compilazione qui.
Il passaggio di std::less<C>()
come argomento aggiuntivo a std::sort()
restituisce un errore di compilazione, in quanto la funzione di confronto richiede che gli oggetti costanti siano comparabili in quel caso. Tuttavia, passando std::less<void>()
non si interrompe nulla, poiché gli argomenti vengono inoltrati perfettamente.
Il std::sort()
algorithm non richiede un completo LessThanComparable
, ma il concetto Compare
. Inoltre, il tipo di iteratore deve essere un ValueSwappable
e MoveAssignable
. Questo è il caso della tua prima domanda, anche quando il bug di costanza non è corretto. Ecco perché lo std::sort()
e altri algoritmi standard funzionano.
fonte
2015-12-29 09:47:06
Ero curioso e l'ho provato. Ho lavorato su C++ 14 qui: http://cpp.sh/4hdh –