了解什么是原子约束

Pil*_*esa 2 c++ language-lawyer c++-concepts c++20

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

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


template <typename T>
concept D = sizeof(T) > 1 && sizeof(T) >= 4;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

表达

赋值表达式

表达式,赋值表达式

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

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

Bar*_*rry 6

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

强调我的。

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

这个语法定义的意思是一个表达式要么是一个assignment-expression要么是另一个表达式 , assignment-expression。语法是根据我们认为的运算符优先级分层排列的:

  • ,具有最低优先级,因此语法首先将其拉出。这就是发生在我们定义表达式recurisvely为表达 , 赋值表达式
  • = 具有下一个最低优先级,因此我们接下来将其拉出。
  • 然后赋值表达式的语法将我们带到逻辑或表达式(下一个最低优先级)
  • 然后logic-and-expression等。

一个赋值表达式实际上并不需要涉及的分配。它实际上是任何一种任意复杂的表达式。我们所知道的是,它绝对不涉及 a,,因为我们已经把它拉出来了。


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

  • @PilarLatiesa 不,不是,因为经过标准化后,您最终会得到 `sizeof(T) &gt; 1` 和 `sizeof(T) &gt;= 4` (即两个单独约束的结合)。 (2认同)