【问题标题】:Why can't I constrain a concept [duplicate]为什么我不能约束一个概念[重复]
【发布时间】:2020-04-18 17:29:32
【问题描述】:

不允许像这样约束一个概念:

template<typename T>
concept A = expr_1;

template<A T>
concept B = expr_2;   // error

但是,似乎总是可以像这样获得相同的结果:

template<typename T>
concept A = expr_1;

template<typename T>
concept B = A<T> && expr_2;   // ok

如果第一个版本总是可以重写为第二个版本,那是什么原因不允许呢?

【问题讨论】:

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


    【解决方案1】:

    从功能设计的角度来看,用户不必在多个地方查找相同的信息。

    concept 定义了一系列对其模板参数的约束。这些约束列在= 符号之后;这就是他们的重点。因此,用户应该能够通过找到= 符号并查看其后面的表达式来查看有关概念的所有信息。

    您的方式意味着我将不得不查看最多三个地方:模板参数定义的约束,模板头的requires 子句(现在必须有可能,因为这就是约束参数的方式定义为工作),以及= 符号后面的表达式。

    既然您可以正确地拼出它,为什么还要为增加的复杂性而烦恼呢?代码的阅读次数多于编写次数,因此我们应该倾向于更简单的阅读而不是方便的编写。

    从功能定义的角度来看,concept 只是一个带有一些特殊功能的constexpr static bool 变量。这就是它使用= 符号来定义其值的原因。

    约束一个模板意味着如果违反约束,这个模板定义不存在

    那么给定template&lt;A T&gt; concept B,当A&lt;T&gt;falseB 的值是多少?根据正常的 C++ 模板约束规则,它没有。事实上,如果你尝试用这种类型实例化它,这个变量甚至都不存在。

    所以根本不是同一个意思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2021-01-22
      • 2023-01-11
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多