std::underlying_type

来自cppreference.com
< cpp‎ | types
 
 
元编程库
类型特征
类型类别
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20 前*)
(C++11)(C++20 中弃用)
(C++11)
类型特征常量
元函数
(C++17)
受支持操作
关系与属性查询
类型修改
(C++11)(C++11)(C++11)
类型变换
(C++11)(C++23 中弃用)
(C++11)(C++23 中弃用)
(C++11)
(C++11)
(C++17)

underlying_type
(C++11)
(C++11)(C++20 前*)(C++17)
编译时有理数算术
编译时整数序列
 
在标头 <type_traits> 定义
template< class T >
struct underlying_type;
(C++11 起)

T 是完整枚举类型,则提供指名 T 的底层类型的成员 typedef type

否则,行为未定义。

(C++20 前)

否则,若 T 不是枚举类型,则无成员 type。否则(T 为不完整枚举类型)程序为非良构。

(C++20 起)

如果程序添加了 std::underlying_type 的特化,那么行为未定义。

成员类型

名称 定义
type T 的底层类型

辅助类型

template< class T >
using underlying_type_t = typename underlying_type<T>::type;
(C++14 起)

注解

每个枚举类型都拥有底层类型,它可以是

  1. 显式指定(有作用域和无作用域枚举均可)
  2. 省略,该情况下对于有作用域枚举是 int,或(对于无作用域枚举)是足以表示枚举所有值的实现定义的整数类型

示例

#include <iostream>
#include <type_traits>
 
enum e1 {};
enum class e2 {};
enum class e3: unsigned {};
enum class e4: int {};
 
int main()
{
    constexpr bool e1_t = std::is_same_v<std::underlying_type_t<e1>, int>;
    constexpr bool e2_t = std::is_same_v<std::underlying_type_t<e2>, int>;
    constexpr bool e3_t = std::is_same_v<std::underlying_type_t<e3>, int>;
    constexpr bool e4_t = std::is_same_v<std::underlying_type_t<e4>, int>;
 
    std::cout
        << "'e1' 的底层类型" << (e1_t ? "是 int" : "不是 int") << '\n'
        << "'e2' 的底层类型" << (e2_t ? "是 int" : "不是 int") << '\n'
        << "'e3' 的底层类型" << (e3_t ? "是 int" : "不是 int") << '\n'
        << "'e4' 的底层类型" << (e4_t ? "是 int" : "不是 int") << '\n';
}

可能的输出:

'e1' 的底层类型不是 int
'e2' 的底层类型是 int
'e3' 的底层类型不是 int
'e4' 的底层类型是 int

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2396 C++11 允许不完整枚举类型 要求完整枚举类型

参阅

(C++11)
检查类型是否是枚举类型
(类模板)
检查类型是否为有作用域枚举类型
(类模板)
转换枚举为其底层类型
(函数模板)