c++ - 为什么我不能约束一个概念

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

<分区>

不允许这样约束一个概念:

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

如果第一个版本总是可以重写为第二个版本,为什么不允许第一个版本?

最佳答案

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

A concept对其模板参数定义了一系列约束。这些约束列在 = 之后符号;这就是他们的重点。因此,用户应该能够通过找到 = 来查看有关概念的所有信息。签名并查看其后的表达式。

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

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

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

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

所以给出template<A T> concept BB的值(value)是多少?什么时候A<T>false ?根据正常的 C++ 模板约束规则,它没有。事实上,如果您尝试用这种类型实例化变量,该变量甚至不存在

所以根本不是同一个意思

关于c++ - 为什么我不能约束一个概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61293390/

相关文章:

c++ - 为什么 ranges::view_interface<T>::size 需要移动构造函数

c++ - 如何访问兼容的 std::variant 变体?

c++ - 将 BitmaskType 与零进行比较的正确方法?

c++ - 我不理解我使用教程创建的这个 makefile 的某些部分

c++ - Vbo如何绘制基元

c++ - `a?b:c` 的操作数可以有不同的类型吗?最好的选择是什么?

c++ - 如果没有提供 Container::value_type,如何获取 C++ Container<T> 的 T?

c++ - Concepts-Lite 将如何与可变参数模板交互?

c++ - std::atomic<struct> 是否使所有成员也是原子的?

c++ - 如何将头文件放入 Bison 中的 .tab.h?