c++ - 了解什么是原子约束
问题描述
我刚刚从 Saar Raz 的演示视频中了解到以下限制:
template <typename T>
concept C = sizeof(T) > 1;
template <typename T>
concept D = sizeof(T) > 1 && sizeof(T) >= 4;
对于重载来说是模棱两可的,因为分别sizeof(T) > 1
发生在C
和的原子约束不等价。D
他们不是因为标准说[templ.constr]:
如果两个原子约束由相同的表达式组成,则它们是相同的[...]
关键是表达式是斜体,指的是语法术语,定义为[expr.comma]:
表达式:
赋值表达式
表达式,赋值表达式
我不明白为什么原子约束需要涉及分配。为什么会这样?
我必须承认,上面的代码最好通过概念改进来编写,但我直觉地认为这种编写方式也是正确的。
解决方案
我不明白为什么原子约束需要涉及分配。为什么会这样?
强调我的。
它不需要涉及分配。只是表达式是表达式的顶级语法术语,它包含所有其他类型的表达式。sizeof(T) > 1
是一个表达式,原样sizeof(T) >= 4
,原样sizeof(T) > 1 && sizeof(T) >= 4
。
这个语法定义的意思是一个表达式要么是一个赋值表达式,要么是另一个表达式 ,
赋值表达式。语法是根据我们认为的运算符优先级分层排列的:
,
具有最低优先级,因此语法首先将其拉出。当我们将表达式递归定义为表达式,
赋值表达式时,就会发生这种情况=
具有次低的优先级,因此我们接下来将其拉出。- 然后赋值表达式的语法将我们带到逻辑或表达式(下一个最低优先级)
- 然后是 logical-and-expression等。
赋值表达式实际上不需要包含赋值。它实际上是任何一种任意复杂的表达方式。我们所知道的是,它绝对不涉及 a ,
,因为我们已经把它拉出来了。
与所有这些不同,目的是如果两个原子约束在源文件中是相同的表达式,则它们是相同的。也就是说,约束包含仅适用于concept
s。
推荐阅读
- x++ - X++ 保留列名?
- bluetooth - 如何将 Raspberry Pi 4 用作蓝牙接收器?
- javascript - 反应 JSON 不返回对象数据
- python - 在行和列中创建列值的数据透视表,并仅计算关系之间的公共值
- node.js - Mongoose/Typegoose 错误:转换为 ObjectId 的值失败
- google-cloud-platform - 使用 psql 客户端连接到 Postgres SQL 实例(私有 IP)
- html - Flex-Grow 根据标记导致不同的宽度
- php - 如何在 React 中使用窗口的 beforeunload 事件执行 axios 代码
- python - TypeError:'dict'对象不可调用-尝试将其他属性添加到python列表时
- concept - 可用计算资源的分配