首页 > 解决方案 > 为什么我不能约束一个概念

问题描述

不允许约束这样的概念:

template<typename T>
concept A = expr_1;

template<A T>
concept B = expr_2;   // error

但是,似乎总是可以像这样实现相同的结果:

template<typename T>
concept A = expr_1;

template<typename T>
concept B = A<T> && expr_2;   // ok

如果总是可以将其重写为第二个,那么不允许第一个版本的原因是什么?

标签: c++c++20c++-concepts

解决方案


从功能设计的角度来看,用户不必在多个地方查找相同的信息。

Aconcept在其模板参数上定义了一系列约束。这些约束列在=符号之后;这就是他们的重点。因此,用户应该能够通过找到=标志并查看其后的表达式来了解有关概念的所有内容。

你的方式意味着我最多需要查看三个地方:模板参数定义的约束,requires模板头的子句(现在必须有可能,因为这是定义受约束参数的方式),以及=符号后面的表达式。

当您可以正确拼写出来时,为什么还要为增加的复杂性而烦恼呢?代码的阅读频率高于编写频率,因此我们应该倾向于更简单的阅读而不是方便的写作。

从功能定义的角度来看,aconcept只是一个constexpr static bool附加了一些特殊功能的变量。这就是为什么它使用=符号来定义它的值。

约束模板意味着如果违反约束,则该模板定义不存在。

所以给定template<A T> concept BBwhen的值A<T>false多少?根据正常的 C++ 模板约束规则,它没有。实际上,如果您尝试使用这种类型实例化它,该变量甚至都不存在。

所以根本不是同一个意思。


推荐阅读