在关于概念 N3701 的最新论文中,算法有以下示例sort
:
template<typename Cont>
requires Sortable<Cont>()
void sort(Cont& cont)
其中Sortable
概念定义为
template<typename T>
concept bool Sortable()
{
return Permutable_container<T>() && Totally_ordered<Value_type<T>>();
}
Totally_ordered
毫不奇怪,其中被定义为
template<typename T>
constexpr bool Totally_ordered()
{
return Weakly_ordered<T>() && Equality_comparable<T>();
}
而反过来又Equality_comparable
被定义为
template<typename T>
constexpr bool Equality_comparable()
{
return requires(T a, T b) {
{a == b} -> bool;
{a != b} -> bool;
};
}
我没有找到 的定义Weakly_ordered
,但我相信它应该看起来像这样(对吗?)
template<typename T>
constexpr bool Weakly_ordered()
{
return requires(T a, T b) {
{a < b} -> bool;
{a <= b} -> bool;
{a > b} -> bool;
{a >= b} -> bool;
};
}
底线,在这个定义中,如果我想排序std::vector<T>
,我需要 T 提供所有比较运算符<
, <=
, >
, >=
, ==
, !=
。但是,在 C++ 的整个生命周期中,std::sort
只需要<
提供运算符!这是cppreference所说的std::sort
:
按升序对范围 [first, last) 中的元素进行排序。不保证保留相等元素的顺序。第一个版本使用 operator< 来比较元素,第二个版本使用给定的比较函数对象 comp。
那么,这是否意味着在未来带有概念的 C++ 中v
,类型为std::vector<T>
whereT
仅提供operator<
,std::sort(v.begin(), v.end())
将编译,而std::sort(v)
不会编译?这听起来很疯狂。
我在 Eric Niebler 的当前range-v3 实现中检查了这一点,它就像我描述的那样工作。除非提供所有运算符,否则代码不会编译。