比较用 C++20 概念表达的命名需求

Compare named requirement expressed with C++20 concepts

我正在编写一个排序算法,它需要一个比较函数,similar to std::sort:

template <class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);

在我看来,模板参数 CompareCompare named requirement 完全匹配。我试图了解如何使用 C++ 20 概念指定该约束,例如 std::strict_weak_orderstd::equivalence_relation,但我有点困惑。

如果我引用the article on cppreference,

The type T satisfies Compare if The type T satisfies BinaryPredicate, and Given
comp, an object of type T equiv(a, b), an expression equivalent to !comp(a, b) && !comp(b, a)

std::strict_weak_ordering 可以捕获上面描述中我对 comp 的限制,但是 equiv 呢? std::equivalence_relation 将关系作为第一个模板参数。我的排序功能会是什么?

在 C++ 中,命名要求的功能比概念和约束更广泛。

例如,我可以有一个命名要求,要求某些算法停止。另一方面,没有办法做出一个需要算法暂停的概念。

概念可以检查一些东西,但不能检查所有的东西。因此,命名需求 Compare 首先表示该事物必须是 BinaryPredicate。 BinaryPredicate 可以描述为一个概念并作为约束提供。

正在确认

if comp(a,b)==true then comp(b,a)==false

将需要添加 C++ 的证明子系统并将正式证明与 comp 一起传递,或者检查您传递给 comp 的类型的每个值。

在某些语言中,您可以传递属性的形式证明,并检查这些形式证明以验证函数参数。 C++ 不是其中之一。

Rice 的定理表明您无法获取代码并验证其重要的属性。要实现与您想要的类似的东西,代码必须增加您对它的声明的证明。然后约束可能需要这些额外信息。使用 Turing tar 坑,您甚至可以使用此功能增强 C++,但之后它看起来不太像 C++(这是来自我,我喜欢将命名运算符添加到 C++ 中以获得乐趣)。

TL;DR 并非所有命名需求都可以表示为概念。概念可以检查一些事情,但不能检查所有事情。记录超出概念约束参数的附加要求是 C++ 中的一件事。