我刚刚从萨尔·拉兹(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]:
如果两个原子约束由相同的表达式 [...]
形成,则它们是相同
关键是 expression 用斜体字表示语法术语,该术语定义为[expr.comma]:
表达式:
任务表达
表达式,赋值表达式
我不明白为什么原子约束需要涉及分配。为什么会这样?
我必须承认,上面的代码最好是通过概念上的改进来编写的,但是我凭直觉认为这种编写方法也是正确的。
答案 0 :(得分:4)
我不明白为什么原子约束需要涉及分配。为什么会这样?
强调我的。
不需要涉及一项作业。只是 expression 是表达式的顶级语法术语,它包含所有其他种类的表达式。 sizeof(T) > 1
是表达式,sizeof(T) >= 4
也是sizeof(T) > 1 && sizeof(T) >= 4
。
此语法定义的意思是表达式是 assignment-expression 或其他 expression ,
赋值表达式。语法是根据我们认为operator precedence的层次结构排列的:
,
的优先级最低,因此语法首先将其拉出。当我们将 expression 定义为 expression ,
assignment-expression =
具有次低的优先级,因此我们将其排在后面。 赋值表达式实际上不需要涉及赋值。实际上,它是任何一种任意复杂的表达式。我们所知道的是,它绝对不涉及,
,因为我们已经将其删除了。
所有其他目的是,如果两个原子约束在源文件中实际上是相同的表达式,则它们是相同的。即约束约束only applies to concept
s。