为什么我们不能专门化概念呢? [英] Why can't we specialize concepts?

查看:15
本文介绍了为什么我们不能专门化概念呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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


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

MSVC表示适用于error C7606: 'C': concept cannot be explicitly instantiated, explicitly specialized or partially specialized行的专业化认证。

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

推荐答案

,因为它将破坏约束规范化和包含规则。

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

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

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

按照C++20的当前规则,B包含A。这是因为,在约束正规化之后,B包含A的所有原子约束。

如果我们允许概念的专门化,那么BA之间的关系现在取决于提供给这些概念的参数B<T>可能包含某些TA<T>,但不包括其他T

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

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

具有讽刺意味的是,允许概念专门化会破坏其他模板的专门化。或者至少,这会使它很难实现。

这篇关于为什么我们不能专门化概念呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆