我正在尝试使用当前的C++20语言将一些较旧的代码更新为即将出现的GCC10语言。
我无法更新一些模板,因为它们使用了std::enable_if<std::is_enum_v<T>>条件,并且在C++20中没有定义std::enumeration概念。
当然,我可以定义自己的概念,但这仍然让我想知道为什么C++20没有将所有现有的类型特征作为概念来实现。
为什么会这样呢?我错过了什么重要的事情吗?
发布于 2020-05-18 18:07:05
没有enumeration的概念,因为从来没有一个特定的意图来创建一个概念来匹配每个类型的特性。甚至他们中的大多数。
C++20概念库或多或少是基于使Ranges库工作所需的内容。它的重点是概念擅长的东西,比如问“我能用这种类型做什么?”您可以询问是否可以默认构造一个T或复制/移动一个等等。你不是在限制某一类型的东西,而是要用它来做什么。
像enumeration这样的概念并不是一个非常有用的约束。记住:从逻辑的角度来看,如果模板约束一个参数,那么它只应该按照该约束使用该参数。因此,如果您有一个采用默认可构造T的函数,那么该函数在默认情况下应该只使用构造一个T (尽管语法上没有什么能阻止您违反该结构,但它通常被认为是糟糕的形式)。
要成为integral或floating_point,需要该类型是这些基本类型之一,这将带来这些类型所提供的所有表现力。
但是你能用enumeration自己做什么呢?您可以默认构造一个(虽然这是否表示合法枚举值并不明显,因此不清楚您将如何处理它),您可以分配和比较它(即使是比较可以重载/deleted),您也可以使用它的底层类型玩游戏。但仅此而已。
如果某些T是枚举,这并不意味着T有任何特定的枚举字段。因此,如果您的约束只是枚举,那么枚举的主要功能就会丢失。
但这并不意味着它就不会出现。但是,仅仅因为偶尔出现一个约束,并不意味着它会上升到一个概念的水平。
https://stackoverflow.com/questions/61875100
复制相似问题