template< class T >
struct underlying_type;
If T
is a complete enumeration (enum) type, provides a member typedef type
that names the underlying type of T
.
Otherwise, the behavior is undefined.
(until C++20)Otherwise, if T
is not an enumeration type, there is no member type
. Otherwise (T
is an incomplete enumeration type), the program is ill-formed.
If the program adds specializations for std::underlying_type
, the behavior is undefined.
type
the underlying type of T
[edit] Helper types
template< class T >
using underlying_type_t = typename underlying_type<T>::type;
Each enumeration type has an underlying type, which can be
#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 << "underlying type for 'e1' is " << (e1_t ? "int" : "non-int") << '\n' << "underlying type for 'e2' is " << (e2_t ? "int" : "non-int") << '\n' << "underlying type for 'e3' is " << (e3_t ? "int" : "non-int") << '\n' << "underlying type for 'e4' is " << (e4_t ? "int" : "non-int") << '\n'; }
Possible output:
underlying type for 'e1' is non-int underlying type for 'e2' is int underlying type for 'e3' is non-int underlying type for 'e4' is int[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior LWG 2396 C++11 incomplete enumeration types were allowed complete enumeration type required [edit] See also checks if a type is an enumeration typeRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4