C++20概念的布尔可测试性之谜

2022-05-16 00:00:00 comparison c++ c++20 c++-concepts

C++20引入了一个比较概念boolean-testable,但我注意到它的斜体和中间的连字符,表示它只用于展示,由于<concepts>中没有所谓的std::boolean_testable,我们不能在我们自己的代码中使用它。

此仅展示概念的用途是什么?为什么这个概念如此神秘?


解决方案

其目的与所有仅用于说明的概念一样,是为了简化标准中的规范。它只是一个构建块,用于指定其他(可能面向用户的)概念,而不需要重复概念模型。值得注意的是,它出现在another exposition-only concept

的规范中
template<class T, class U>
  concept weakly-equality-comparable-with = // exposition only
    requires(const remove_reference_t<T>& t,
             const remove_reference_t<U>& u) {
      { t == u } -> boolean-testable;
      { t != u } -> boolean-testable;
      { u == t } -> boolean-testable;
      { u != t } -> boolean-testable;
    };

weakly-equality-comparable-with对于用不一定逐字返回的返回类型重载比较运算符的类型是满足的。我们仍然可以使用这些表达来比较对象,因此该标准试图对它们进行推理。这不是假设,它们可以出现在野外。Palo Alto report中的一个示例:

.一个这样的例子是QChar类的早期版本(至少是1.5版和更早版本)(诺基亚公司,2011)。

class QChar
{
  friend int operator==(QChar c1, QChar c2);
  friend int operator!=(QChar c1, QChar c2);
};

我们应该能够在我们的标准算法中使用此类,尽管运算符不返回布尔值。

关于您的其他问题

为什么这个概念如此神秘?

并非如此。但如果仅从cp首选项来检查它,可能会错过上下文,因为在那里交叉引用它可能并不容易。

相关文章