首页 > 解决方案 > 了解什么是原子约束

问题描述

我刚刚从 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]

表达式

赋值表达式

表达式,赋值表达式

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

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

标签: c++language-lawyerc++20c++-concepts

解决方案


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

强调我的。

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

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

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

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


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


推荐阅读