为什么我们不能专门化概念呢?
适用于类的语法不适用于概念:
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
的所有原子约束。
如果我们允许概念的专门化,那么B
和A
之间的关系现在取决于提供给这些概念的参数。B<T>
可能包含某些T
的A<T>
,但不包括其他T
。
但这不是我们使用概念的方式。如果我试图编写一个比另一个模板更受约束的模板,唯一的方法是使用一组已知的、定义良好的概念。并且这些定义不能依赖于这些概念的参数。
编译器应该能够计算一个受约束的模板是否比另一个更受约束,而不需要任何模板参数。这一点很重要,因为让一个模板比另一个模板更受约束是使用概念和约束的一个关键功能。
具有讽刺意味的是,允许概念专门化会破坏其他模板的专门化。或者至少,这会使它很难实现。
相关文章