Czy C
używane w standardowych algorytmów jak std::sort
że obecnie używa domyślny <
operator?
Tak, działa dla std::sort()
i kilku innych standardowych algorytmów. Kod kompilacji:
#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));
}
. Here's a live demo. Spójrz na następne pytanie!
Czy C
jest uważany za spełniający koncepcję LessThanComparable
?
Lp Wymagania koncepcji LessThanComparable
to, że dla obiektów x
i y
typu C
lub const C
ekspresji x<y
jest ważna i niejawnie zamienny do bool i operator <
ustanawia ścisłą słabą relację zamawiania. W twoim przypadku obiekty const nie zostaną przekształcone w int
s. To jest błąd w kodzie, ponieważ nie jest poprawny. Dodanie słowa kluczowego const
spowoduje jego działanie, a klasa C
będzie rzeczywiście LessThanComparable
. Zachowana jest ścisła relacja zamawiająca, ponieważ spełniają one ten wymóg.
Will C
spełniają wymagania stawiane hipotetycznej conceptified algorytm biblioteki, które wymagałyby typ być LessThanComparable
.
Jeśli ustalisz swoją stałość, tak, będzie.
Kilka sidenotes:
GCC 4.9 kompiluje x<y
nawet jeśli x
i y
są typu const C
. Wydaje się, że jest to błąd kompilatora, ponieważ GCC 5.2 i clang 3.6 powodują tutaj błąd czasu kompilacji.
Podanie std::less<C>()
jako dodatkowy argument do std::sort()
podaje błąd czasu kompilacji, ponieważ funkcja porównywania wymaga, aby obiekty stałe były porównywalne w tym przypadku. Jednak przekazanie std::less<void>()
niczego nie psuje, ponieważ argumenty są idealnie przekierowane.
- Nie wymaga pełnego , ale koncepcji
Compare
. Ponadto typem iteratora musi być RandomAccessIterator
, czyli ValueSwappable
, a typ wyodrębniony musi być MoveContructable
i MoveAssignable
. Tak jest w przypadku pierwszego pytania, nawet jeśli błąd constness nie został naprawiony. Właśnie dlatego działa std::sort()
i inne standardowe algorytmy.
Byłem ciekawy i wypróbowałem to. Pracowałem nad C++ 14 tutaj: http://cpp.sh/4hdh –