了解什么是原子约束

时间:2019-08-31 11:39:23

标签: c++ language-lawyer c++20 c++-concepts atomic-constraints

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

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


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

对于重载是模棱两可的,因为分别在sizeof(T) > 1C出现的原子约束D是不等效的。

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

  

如果两个原子约束由相同的表达式 [...]

形成,则它们是相同

关键是 expression 用斜体字表示语法术语,该术语定义为[expr.comma]

  

表达式

     

任务表达

     

表达式赋值表达式

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

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

1 个答案:

答案 0 :(得分:4)

  

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

强调我的。

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

此语法定义的意思是表达式 assignment-expression 或其他 expression , 赋值表达式。语法是根据我们认为operator precedence的层次结构排列的:

  • ,的优先级最低,因此语法首先将其拉出。当我们将 expression 定义为 expression , assignment-expression
  • 时,就会发生这种情况
  • =具有次低的优先级,因此我们将其排在后面。
  • 然后 assignment-expression 的语法将我们带到 logic-or-expression (次低优先级)
  • 然后是逻辑表达

赋值表达式实际上不需要涉及赋值。实际上,它是任何一种任意复杂的表达式。我们所知道的是,它绝对不涉及,,因为我们已经将其删除了。


所有其他目的是,如果两个原子约束在源文件中实际上是相同的表达式,则它们是相同的。即约束约束only applies to concepts