c++ - 规范化约束时需要表达式是原子吗?
问题描述
我想确保我正确理解约束规范化过程,因为 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 < RevIterator
butDecrementable
和RevIterator2
未订购。
那么,这是正确的吗?或者有人可以指出我谈论这个的标准的具体部分吗?
解决方案
是的,你的理解是正确的。为了发生包含(您用 表示<
),约束表达式的范式之间必须存在某种关系。如果检查约束规范化过程:
[temp.constr.normal]
1表达式 E 的范式是一个约束,定义如下:
- 表达式
( E )
的范式是 的范式E
。- 表达式的范式是和
E1 || E2
范式的析取。E1
E2
- 表达式的范式是和
E1 && E2
的范式的合取。E1
E2
- concept-id
C<A1, A2, ..., An>
的范式是 的约束表达式的范式,在每个原子约束中的参数映射中C
,用A1
,A2
, ...,An
代替的各个模板参数。C
如果任何此类替换导致无效的类型或表达式,则程序格式错误;不需要诊断。
[ ... ]- 任何其他表达式的正常形式
E
是原子约束,其表达式为 E,其参数映射为恒等映射。
人们看到逻辑 AND 表达式、逻辑 OR 表达式和概念 ID 是唯一被“分解”的表达式。其他所有类型的表达式几乎都形成了自己的原子约束,包括requires
像requires(T t) { --t; *t; }
.
推荐阅读
- javascript - 使用 SVG 封面逐步显示 png 图像
- css - HTML 表单字段不会保留伪类
- git - 如何将 svn 提交历史或 svn 日志迁移到 gitlab
- php - rackspace 子容器不上传文件
- css - 自动行高 - 忽略第一项的高度
- angularjs - 使用 Gulp 配置 Express 路由
- ssis - SSIS 数据加载将值截断到目标表中
- linux - Ubuntu 18 nixpkgs conda - 重定位错误 libc.so.6 符号 _dl_exception_create,版本 GLIBC_PRIVATE ld-linux-x86-64.so.2 链接时间参考
- php - 正则表达式多次捕获同一组
- sql - 如何定义列的约束以在 oracle 中具有字母数字值?