了解什么是原子约束

Understanding what atomic constraints are

我刚刚从 Saar Raz 的演示视频中了解到以下限制条件:

template <typename T>
concept C = sizeof(T) > 1;


template <typename T>
concept D = sizeof(T) > 1 && sizeof(T) >= 4;

对于重载是不明确的,因为原子约束 sizeof(T) > 1 分别出现在 CD 处,不等价。

他们不是因为标准说 [templ.constr]:

Two atomic constraints are identical if they are formed from the same expression [...]

关键是expression是斜体,指的是语法术语,定义为[expr.comma]:

expression:

assignment-expression

expression , assignment-expression

我不明白为什么原子约束需要涉及赋值。为什么会这样?

我必须承认上面的代码最好是通过概念细化来写的,但我直觉地认为这种写法也是正确的。

I don't understand why an atomic constraint needs to involve an assignment. Why is so?

强调我的。

不需要涉及作业。只是 expression 是表达式的顶级语法术语,它包含所有其他类型的表达式。 sizeof(T) > 1 是一个 表达式 sizeof(T) >= 4 也是,sizeof(T) > 1 && sizeof(T) >= 4.

这个语法定义的意思是 expressionassignment-expression 或另一个 expression , 赋值表达式。语法是根据我们认为的 operator precedence:

分层排列的
  • , 具有最低的优先级,因此语法首先将其拉出。这就是当我们将 expression 递归定义为 expression , assignment-expression[= 时发生的情况62=]
  • = 具有次低的优先级,因此我们接下来将其拉出。
  • 然后 assignment-expression 的语法将我们带到 logical-or-expression(下一个最低优先级)
  • 然后逻辑与表达式,等等

赋值表达式实际上不需要涉及赋值。它实际上是任意一种复杂的表达式。我们所知道的是,它绝对不涉及 ,,因为我们已经把那个去掉了。


与所有这些不同的是,如果两个原子约束在源文件中实际上是相同的表达式,则它们是相同的。即约束包含.