当前位置: 首页 > 知识库问答 >
问题:

为什么我们不能将概念专门化?

康言
2023-03-14

适用于类的语法不适用于概念:

template <class Type>
concept C = requires(Type t) {
    // ...
};


template <class Type>
concept C<Type*> = requires(Type t) {
    // ...
};

MSVC对“专门化”一行说:错误C7606:'C':概念不能被显式实例化、显式专门化或部分专门化

为什么概念不能专门化?有理论上的原因吗?

共有1个答案

鲁展
2023-03-14

因为这会破坏约束规范化和包容规则。

现在,每个概念都只有一个确切的定义。因此,概念之间的关系是已知且固定的。考虑以下事项:

template<typename T>
concept A = atomic_constraint_a<T>;

template<typename T>
concept B = atomic_constraint_a<T> && atomic_constraint_b<T>;

根据C20当前的规则,B包含A。这是因为,在约束规范化之后,B包括A的所有原子约束。

如果我们允许概念的特殊化,那么BA之间的关系现在取决于提供给这些概念的参数。B

但这不是我们使用概念的方式。如果我试图编写一个比另一个模板“更受约束”的模板,那么唯一的方法就是使用一组已知的、定义良好的概念。这些定义不能依赖于这些概念的参数。

编译器应该能够计算一个约束模板是否比另一个约束更多,而不需要任何模板参数。这很重要,因为一个模板比另一个模板“更受约束”是使用概念和约束的一个关键特征。

具有讽刺意味的是,允许对概念进行专门化将打破(受限制的)对其他模板的专门化。或者至少,这会让它很难实现。

 类似资料:
  • 这个问题演示了如何使用C++20概念为函数模板选择重载。我试图做一些类似的事情:为类模板选择专门化。 编译器将此附加实现视为使用不同约束对模板的重新声明。我尝试了几种不同的方式来表达我的意图,但没有一种能满足我所尝试的编译器。事实上,我甚至无法用和传统的SFINAE实现这一点--诚然,我完全有可能不太理解SFINAE。 我发现的唯一方法需要对每种整型和浮点型进行不同的专门化。 [是的,我知道还有几

  • 约束类型名J与类型名U相同的好方法是什么?

  • 问题内容: 为什么Java不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。

  • 似乎具有与相同的明显含义,但它甚至不能在clang上编译。这有原因吗?

  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 如果我们有覆盖的概念,为什么我们应该选择抽象类。无论如何,我们必须扩展抽象类来给出抽象方法的定义,我们可以简单地扩展和重写它的抽象方法,那么使它抽象的逻辑是什么呢?