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

Sil*_*cer 3 c++ type-traits c++-standard-library c++-concepts c++20

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

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

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

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

Nic*_*las 5

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

C++20 概念库或多或少基于使 Ranges 库工作所需的内容。它专注于概念擅长的事情,比如问“我可以用这种类型做什么?” 您可以询问是否可以默认构造一个T或复制/移动一个,等等。你不是在限制类型是什么,而是你将用它做什么。

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

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

但是,你能不能做enumeration 本身?您可以默认构造一个(尽管这是否代表合法的枚举值并不明显,因此不清楚您将用它做什么),您可以分配和比较它(尽管甚至可以重载比较/ deleted ),您可以使用其底层类型玩游戏。但仅此而已。

如果 someT是枚举,那并不意味着 theT具有任何特定的枚举字段。因此,如果您的约束只是枚举,则枚举的主要功能对您来说就失去了。

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