【问题标题】:Understanding what atomic constraints are了解什么是原子约束
【发布时间】:2019-08-31 11:39:23
【问题描述】:

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

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


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

对于重载来说是模棱两可的,因为原子约束 sizeof(T) &gt; 1 分别出现在 CD 上并不等价。

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

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

构成,则它们是相同的

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

表达式

赋值表达式

表达式 , 赋值表达式

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

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

【问题讨论】:

  • 措辞确实比较混乱,见github.com/cplusplus/draft/issues/2554
  • 我想知道sizeof(T) 怎么可以大于或等于4,但不能大于1。
  • @SamVarshavchik 我不明白你的评论。您熟悉概念和最受约束的概念吗?看看这个:wandbox.org/permlink/wLOl0CdelaigTfvs
  • @SamVarshavchik Saar Raz 负责在 Clang 中实现概念:reviews.llvm.org/p/saar.raz。他不是小丑。 template &lt;typename T&gt; concept D = C&lt;T&gt; &amp;&amp; sizeof(T) &gt;= 4 是完全有效且有意义的代码。
  • @SamVarshavchik C&lt;T&gt; &amp;&amp; sizeof(T) &gt;= 4 有效地做到了这一点,但您同意它对于重载解决方案很有用。我显然意识到C 是多余的,但编译器有必要弄清楚DC 更受约束。你在一个明显的事情上如此糟糕地暗示我误解了你。

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


【解决方案1】:

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

强调我的。

它并不需要涉及分配。只是 expression 是表达式的顶级语法术语,它包含了所有其他类型的表达式。 sizeof(T) &gt; 1 是一个表达式sizeof(T) &gt;= 4 也是,sizeof(T) &gt; 1 &amp;&amp; sizeof(T) &gt;= 4 也是。

这个语法定义的意思是 expression 要么是一个 assignment-expression 要么是另一个 expression , assignment-表达式。语法是根据我们认为是operator precedence的层次排列的:

  • , 的优先级最低,因此语法首先将其拉出。这就是当我们将 expression 递归定义为 expression , assignment-expression 时会发生的情况
  • = 的优先级次之,因此我们将其拉出。
  • 然后 assignment-expression 的语法将我们带到 logical-or-expression(下一个最低优先级)
  • 然后是logical-and-expression

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


与所有这些不同的是,如果两个原子约束在源文件中实际上是相同的表达式,则它们的意图是相同的。即约束包含only applies to concepts

【讨论】:

  • sizeof(T) &gt; 1 &amp;&amp; sizeof(T) &gt;= 4 是原子约束吗?如果是这样,我不明白本段中的注释:eel.is/c++draft/temp.constr#atomic-1
  • @PilarLatiesa 不,不是,因为在进行标准化后,您最终会得到 sizeof(T) &gt; 1sizeof(T) &gt;= 4(即两个单独约束的结合)。
  • 你的最后一句话是我想知道的。链接的问题也非常有用。我猜原子约束的概念只对编译器实现者有用,而程序员使用概念。谢谢
  • 当您在“最小的组合单位”或“不能进一步分解”的意义上考虑“原子”这个词时,这会更有意义。在这种情况下,考虑到它必须计算为 bool 的要求,sizeof(T) &gt; 1 是原子的,而 sizeof(T) &gt; 1 &amp;&amp; sizeof(T) &gt;= 4 是两个原子表达式的结合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多