了解什么是原子约束

Understanding what atomic constraints are

本文关键字:约束 什么 了解      更新时间:2023-10-16

我刚刚从萨尔·拉兹(Saar Raz(的演示视频中了解到以下限制:

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

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

对于重载是不明确的,因为分别发生在CDsizeof(T) > 1原子约束是不等价的。

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

如果两个原子约束由相同的表达式形成,则它们是相同的[...]

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

表达式

赋值表达式

表达式赋值表达式

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

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

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

强调我的。

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

此语法定义的意思是表达式是赋值表达式或另一个,值表达式表达式。语法是根据我们认为的运算符优先级分层排列的:

  • ,的优先级最低,因此语法首先拉出该优先级。这就是当我们递归地将表达式定义为表达式,赋值表达式时发生的情况
  • =的优先级次低,所以我们接下来拉出那个优先级。
  • 然后赋值表达式的语法将我们带到逻辑或表达式(下一个最低优先级(
  • 然后是逻辑和表达等。

赋值表达式实际上不必涉及赋值。它实际上是任意复杂的表达。我们所知道的是,它绝对不涉及,,因为我们已经把那个拉出来了。


与所有这些分开,目的是如果两个原子约束在源文件中实际上是相同的表达式,则它们是相同的。也就是说,约束包容仅适用于concept