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

问题描述 投票:0回答:1

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

我无法更新一些模板,因为它们使用了一个 "枚举 "概念。std::enable_if<std::is_enum_v<T>> 状况,没有 std::enumeration 在C++20中定义的概念。

当然,我可以定义我自己的概念,但还是让我感到奇怪,为什么C++20没有把所有现有的类型特征作为概念来实现。

为什么会这样?我是不是错过了什么重要的东西?

c++ typetraits c++-standard-library c++20 c++-concepts
1个回答
5
投票

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

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

一个像 enumeration 并不是一个非常有用的约束条件。请记住:从逻辑的角度来看,如果一个模板约束了一个参数,那么它应该只使用符合该约束的参数。所以,如果你有一个函数,它取一个默认可构造的 T,那么该函数应该只使用 T 默认构造一个(尽管在语法上没有什么能阻止你违反这一点,但这通常被认为是糟糕的形式)。

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

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

如果一些 T 是一个枚举,但这并不意味着 T 有任何特定的枚举字段。所以,如果你的约束仅仅是它是一个枚举,那么枚举的主要特征就会被你遗忘。

这并不意味着它不能出现。但仅仅因为一个约束偶尔会出现,并不意味着它上升到了作为一个概念的层次。

© www.soinside.com 2019 - 2024. All rights reserved.