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]:
表达:
赋值表达式
表达式,赋值表达式
我不明白为什么原子约束需要涉及赋值。为什么会这样?
我必须承认,上面的代码最好通过概念细化来编写,但我直觉地认为这种编写方式也是正确的。
我不明白为什么原子约束需要涉及赋值。为什么会这样?
强调我的。
它不需要涉及任务。只是表达式是表达式的顶级语法术语,它包含所有其他类型的表达式。sizeof(T) > 1是一个表达式,原样sizeof(T) >= 4,原样sizeof(T) > 1 && sizeof(T) >= 4。
这个语法定义的意思是一个表达式要么是一个assignment-expression要么是另一个表达式 , assignment-expression。语法是根据我们认为的运算符优先级分层排列的:
,具有最低优先级,因此语法首先将其拉出。这就是发生在我们定义表达式recurisvely为表达 , 赋值表达式= 具有下一个最低优先级,因此我们接下来将其拉出。一个赋值表达式实际上并不需要涉及的分配。它实际上是任何一种任意复杂的表达式。我们所知道的是,它绝对不涉及 a,,因为我们已经把它拉出来了。
与所有这些不同的是,如果两个原子约束在源文件中实际上是相同的表达式,则它们的意图是相同的。也就是说,约束包含仅适用于concepts。