为什么C++ 20没有枚举概念?

Why is there no enumeration concept in C++ 20?

我正在尝试使用当前的 GCC10 将一些旧代码更新为即将到来的 C++20 语言。

我无法更新某些模板,因为它们使用了 std::enable_if<std::is_enum_v<T>> 条件,并且 C++20 中没有定义 std::enumeration 概念。

当然我可以定义我自己的概念,但它仍然让我想知道为什么 C++20 没有将所有现有的类型特征实现为概念。

这是为什么?我错过了什么重要的事情吗?

没有 enumeration 概念,因为从来没有特定的意图来创建一个概念来匹配每个类型特征。甚至大部分。

C++20 概念库或多或少地基于使 Ranges 库工作所需的内容。它专注于概念擅长的事情,比如询问 "what can I do with this type?" 你可以询问是否可以默认构造一个 T 或 copy/move 等等。您不是在限制类型是什么,而是要用它做什么。

enumeration 这样的概念并不是一个非常有用的约束。请记住:从逻辑的角度来看,如果一个模板约束了一个参数,那么它应该只使用符合该约束的参数。因此,如果您有一个采用可默认构造的 T 的函数,那么该函数在默认情况下应该只使用 T 构造一个(尽管在语法上没有任何内容可以阻止您违反它,但通常认为它是糟糕的形式)。

要成为 integralfloating_point 要求类型是这些基本类型之一,这会带来这些类型提供的所有表现力。

但是 enumeration 单独 可以做什么?您可以默认构造一个(尽管这是否表示合法的枚举值并不明显,因此不清楚您将如何处理它),您可以分配和比较它(尽管即使比较也可以重载/deleted), 你可以用它的底层类型来玩游戏。但仅此而已。

如果某些 T 是一个枚举,那并不意味着 T 有任何特定的枚举字段。因此,如果您的约束仅仅是枚举,那么枚举的主要特征对您来说是丢失的。

这并不意味着它不能出现。但仅仅因为偶尔出现约束并不意味着它上升到概念的水平。