首页 > 解决方案 > 规范化约束时需要表达式是原子吗?

问题描述

我想确保我正确理解约束规范化过程,因为 cppreference 在这个主题上有点模糊。

似乎在规范化过程中requires,无论多么具体/复杂,表达式内部的任何内容都始终被视为原子。

这似乎得到了不同处理的支持:

template<typename T>
concept Decrementable = requires(T t) { --t; };

template<typename T>
concept RevIterator = Decrementable<T> && requires(T t) { *t; };

template<typename T>
concept RevIterator2 = requires(T t) { --t; *t; };

where Decrementable < RevIteratorbutDecrementableRevIterator2未订购。

那么,这是正确的吗?或者有人可以指出我谈论这个的标准的具体部分吗?

标签: c++c++20c++-concepts

解决方案


是的,你的理解是正确的。为了发生包含(您用 表示<),约束表达式的范式之间必须存在某种关系。如果检查约束规范化过程:

[temp.constr.normal]

1表达式 E 的范式是一个约束,定义如下:

  • 表达式( E )的范式是 的范式E
  • 表达式的范式是和E1 || E2范式的析取。E1E2
  • 表达式的范式是和E1 && E2的范式的合取。E1E2
  • concept-idC<A1, A2, ..., An>的范式是 的约束表达式的范式,在每个原子约束中的参数映射中C,用A1, A2, ...,An代替的各个模板参数。C如果任何此类替换导致无效的类型或表达式,则程序格式错误;不需要诊断。
    [ ... ]
  • 任何其他表达式的正常形式E是原子约束,其表达式为 E,其参数映射为恒等映射。

人们看到逻辑 AND 表达式、逻辑 OR 表达式和概念 ID 是唯一被“分解”的表达式。其他所有类型的表达式几乎都形成了自己的原子约束,包括requiresrequires(T t) { --t; *t; }.


推荐阅读