std::underlying_type

< cpp‎ | types
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等字符串转换
(C++17)
(C++17)
 
类型支持
基本类型
基础类型
定宽整数类型 (C++11)
数值极限
C 数值极限接口
运行时类型信息
类型特性
类型类别
(C++11)
(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++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 起)

添加 underlying_type 的特化的程序行为未定义。

成员类型

 
名称 定义
type T 的底层类型

辅助类型

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

注解

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

1. 显式指定(有作用域和无作用域枚举均可)

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

缺陷报告

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

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

示例

#include <iostream>
#include <type_traits>
 
enum e1 {};
enum class e2: int {};
 
int main() {
    bool e1_type = std::is_same<
        unsigned
       ,typename std::underlying_type<e1>::type
    >::value; 
 
    bool e2_type = std::is_same<
        int
       ,typename std::underlying_type<e2>::type
    >::value;
 
    std::cout
    << "underlying type for 'e1' is " << (e1_type?"unsigned":"non-unsigned") << '\n'
    << "underlying type for 'e2' is " << (e2_type?"int":"non-int") << '\n';
}

输出:

underlying type for 'e1' is unsigned
underlying type for 'e2' is int