Why can#39;t we specialize concepts?(为什么我们不能专门化概念呢?)
问题描述
适用于类的语法不适用于概念:
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
。
但这不是我们使用概念的方式。如果我试图编写一个比另一个模板更受约束的模板,唯一的方法是使用一组已知的、定义良好的概念。并且这些定义不能依赖于这些概念的参数。
编译器应该能够计算一个受约束的模板是否比另一个更受约束,而不需要任何模板参数。这一点很重要,因为让一个模板比另一个模板更受约束是使用概念和约束的一个关键功能。
具有讽刺意味的是,允许概念专门化会破坏其他模板的专门化。或者至少,这会使它很难实现。
这篇关于为什么我们不能专门化概念呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么我们不能专门化概念呢?


基础教程推荐
- 这个宏可以转换成函数吗? 2022-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 常量变量在标题中不起作用 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01