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


基础教程推荐
- C++,'if' 表达式中的变量声明 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31