C++20概念的布尔可测试性之谜
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首选项来检查它,可能会错过上下文,因为在那里交叉引用它可能并不容易。
相关文章