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


- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- XML Schema 到 C++ 类 2022-01-01
- DoEvents 等效于 C++? 2021-01-01
- GDB 不显示函数名 2022-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 将 hdc 内容复制到位图 2022-09-04
- 将函数的返回值分配给引用 C++? 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01