Ответ 1
Является
C
применимым в стандартных алгоритмах, таких какstd::sort
, который в настоящее время использует по умолчанию оператор<
?
Да, он работает для std::sort()
и некоторых других стандартных алгоритмов. Код
#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) );
}
компилирует. Вот живая демонстрация. Посмотрите на следующий вопрос, хотя!
Является ли
C
рассмотренным как удовлетворяющее концепцииLessThanComparable
?
Нет. Требования концепции LessThanComparable
заключаются в том, что для объектов x
и y
типа C
или const C
выражение x<y
справедливо и неявно конвертируется в bool, а оператор <
устанавливает строгую слабое отношение порядка. В вашем случае объекты const не преобразуются в int
s. Это ошибка в коде, потому что она не является корректной. Добавление ключевого слова const
заставит его работать, а класс C
действительно будет LessThanComparable
. Строгое слабое упорядоченное соотношение выполняется, так как int
выполняет это требование.
Будет ли
C
соответствовать требованиям гипотетического концептуального алгоритма библиотеки, для которой требуется, чтобы тип былLessThanComparable
.
Если вы исправите свою константу, да, она будет.
Несколько побочных элементов:
-
GCC 4.9 компилирует
x<y
, даже еслиx
иy
имеют типconst C
. Это, похоже, ошибка компилятора, поскольку GCC 5.2 и clang 3.6 вызывают ошибку времени компиляции. -
Передача
std::less<C>()
в качестве дополнительного аргумента дляstd::sort()
дает ошибку времени компиляции, потому что функция сравнения требует, чтобы в этом случае константные объекты были сопоставимыми. Однако прохождениеstd::less<void>()
ничего не нарушает, поскольку аргументы отлично перенаправляются. -
std::sort()
алгоритм не требует полногоLessThanComparable
, а концепцииCompare
. Кроме того, тип итератора должен бытьRandomAccessIterator
, то естьValueSwappable
, а тип разыменования должен бытьMoveContructable
иMoveAssignable
. Это касается вашего первого вопроса, даже если ошибка constness не исправлена. Вот почему работаютstd::sort()
и другие стандартные алгоритмы.