C++约束归一化处理时requires表达式是否被视为原子约束?
结论
你的理解完全正确。
规则解释
约束归一化的核心目标是将任意约束表达式拆解为原子约束的合取/析取范式,用于后续约束偏序关系(即概念的包含关系)的判定。其中核心规则是:任何requires表达式本身属于不可拆分的原子约束,无论其内部包含多少条要求、逻辑结构多复杂,归一化过程都不会拆解requires表达式的内部内容,只会将整个requires表达式视为单个原子约束处理。
示例逻辑说明
结合你给出的三个概念,我们可以清晰看到规则的落地逻辑:
- 对
RevIterator,其约束定义为Decrementable<T> && requires(T t) { *t; },归一化后会拆分为两个独立原子约束的合取:- 原子约束1:
Decrementable<T>展开后对应的原子约束 - 原子约束2:后面整个
requires(T t) { *t; }表达式
做偏序比较时,Decrementable的所有原子约束都可以被RevIterator的原子约束子集匹配,因此Decrementable < RevIterator成立。
- 原子约束1:
- 对
RevIterator2,其整个约束就是单个requires(T t) { --t; *t; }表达式,归一化后仅生成1个原子约束(即这个完整的requires表达式本身)。它和Decrementable对应的原子约束(Decrementable的requires表达式)是两个完全独立、没有关联的原子约束,不存在包含关系,因此二者没有偏序关系。
对应标准条款
规则对应ISO/IEC 14882:2020(C++20标准)的以下条款:
- 13.5.1 约束归一化 [temp.constr.normal]:第1条第1.7款明确规定,若原表达式为requires表达式,归一化结果为单个原子约束,其表达式为该requires表达式本身,参数映射为恒等映射。
- 13.5.4 约束偏序 [temp.constr.order]:规定了偏序关系的判定规则,只有约束A的所有原子约束都能被约束B的原子约束子集匹配时,才判定A被B包含(即A < B)。
内容的提问来源于stack exchange,提问作者Šimon Tóth
相关产品推荐
相关产品推荐

