# Library feature-test macros (since C++20)

From cppreference.com
< cpp‎ | utility

Each of following macros is defined if the header `<version>` or one of the corresponding headers specified in the table is included.

Macro name | Value | Header
--- | --- | ---
`__cpp_lib_addressof_constexpr` | 201603L | `<memory>`
`__cpp_lib_algorithm_iterator_requirements` | 202207L | `<algorithm>` `<numeric>` `<memory>`
`__cpp_lib_allocate_at_least` | 202302L | `<memory>`
`__cpp_lib_allocator_traits_is_always_equal` | 201411L | `<memory>` `<scoped_allocator>` `<string>` `<deque>` `<forward_list>` `<list>` `<vector>` `<map>` `<set>` `<unordered_map>` `<unordered_set>`
`__cpp_lib_adaptor_iterator_pair_constructor` | 202106L | `<stack>` `<queue>`
`__cpp_lib_any` | 201606L | `<any>`
`__cpp_lib_apply` | 201603L | `<tuple>`
`__cpp_lib_array_constexpr` | 201811L | `<iterator>` `<array>`
`__cpp_lib_as_const` | 201510L | `<utility>`
`__cpp_lib_associative_heterogeneous_erasure` | 202110L | `<map>` `<set>` `<unordered_map>` `<unordered_set>`
`__cpp_lib_assume_aligned` | 201811L | `<memory>`
`__cpp_lib_atomic_flag_test` | 201907L | `<atomic>`
`__cpp_lib_atomic_float` | 201711L | `<atomic>`
`__cpp_lib_atomic_is_always_lock_free` | 201603L | `<atomic>`
`__cpp_lib_atomic_lock_free_type_aliases` | 201907L | `<atomic>`
`__cpp_lib_atomic_ref` | 201806L | `<atomic>`
`__cpp_lib_atomic_shared_ptr` | 201711L | `<memory>`
`__cpp_lib_atomic_value_initialization` | 201911L | `<atomic>` `<memory>`
`__cpp_lib_atomic_wait` | 201907L | `<atomic>`
`__cpp_lib_barrier` | 202302L | `<barrier>`
`__cpp_lib_bind_back` | 202202L | `<functional>`
`__cpp_lib_bind_front` | 201907L | `<functional>`
`__cpp_lib_bit_cast` | 201806L | `<bit>`
`__cpp_lib_bitops` | 201907L | `<bit>`
`__cpp_lib_bool_constant` | 201505L | `<type_traits>`
`__cpp_lib_bounded_array_traits` | 201902L | `<type_traits>`
`__cpp_lib_boyer_moore_searcher` | 201603L | `<functional>`
`__cpp_lib_byte` | 201603L | `<cstddef>`
`__cpp_lib_byteswap` | 202110L | `<bit>`
`__cpp_lib_char8_t` | 201907L | `<atomic>` `<filesystem>` `<istream>` `<limits>` `<locale>` `<ostream>` `<string>` `<string_view>`
`__cpp_lib_chrono` | 201907L | `<chrono>`
`__cpp_lib_chrono_udls` | 201304L | `<chrono>`
`__cpp_lib_clamp` | 201603L | `<algorithm>`
`__cpp_lib_common_reference` | 202302L | `<type_traits>`
`__cpp_lib_common_reference_wrapper` | 202302L | `<functional>`
`__cpp_lib_complex_udls` | 201309L | `<complex>`
`__cpp_lib_concepts` | 202207L | `<concepts>` `<compare>`
`__cpp_lib_constexpr_algorithms` | 201806L | `<algorithm>` `<utility>`
`__cpp_lib_constexpr_bitset` | 202207L | `<bitset>`
`__cpp_lib_constexpr_charconv` | 202207L | `<charconv>`
`__cpp_lib_constexpr_cmath` | 202202L | `<cmath>` `<cstdlib>`
`__cpp_lib_constexpr_complex` | 201711L | `<complex>`
`__cpp_lib_constexpr_dynamic_alloc` | 201907L | `<memory>`
`__cpp_lib_constexpr_functional` | 201907L | `<functional>`
`__cpp_lib_constexpr_iterator` | 201811L | `<iterator>`
`__cpp_lib_constexpr_memory` | 202202L | `<memory>`
`__cpp_lib_constexpr_numeric` | 201911L | `<numeric>`
`__cpp_lib_constexpr_string` | 201907L | `<string>`
`__cpp_lib_constexpr_string_view` | 201811L | `<string_view>`
`__cpp_lib_constexpr_tuple` | 201811L | `<tuple>`
`__cpp_lib_constexpr_typeinfo` | 202106L | `<typeinfo>`
`__cpp_lib_constexpr_utility` | 201811L | `<utility>`
`__cpp_lib_constexpr_vector` | 201907L | `<vector>`
`__cpp_lib_containers_ranges` | 202202L | `<vector>` `<list>` `<forward_list>` `<map>` `<set>` `<unordered_map>` `<unordered_set>` `<deque>` `<queue>` `<stack>` `<string>`
`__cpp_lib_coroutine` | 201902L | `<coroutine>`
`__cpp_lib_destroying_delete` | 201806L | `<new>`
`__cpp_lib_enable_shared_from_this` | 201603L | `<memory>`
`__cpp_lib_endian` | 201907L | `<bit>`
`__cpp_lib_erase_if` | 202002L | `<string>` `<deque>` `<forward_list>` `<list>` `<vector>` `<map>` `<set>` `<unordered_map>` `<unordered_set>`
`__cpp_lib_exchange_function` | 201304L | `<utility>`
`__cpp_lib_execution` | 201902L | `<execution>`
`__cpp_lib_expected` | 202211L | `<expected>`
`__cpp_lib_filesystem` | 201703L | `<filesystem>`
`__cpp_lib_flat_map` | 202207L | `<flat_map>`
`__cpp_lib_flat_set` | 202207L | `<flat_set>`
`__cpp_lib_format` | 202207L | `<format>`
`__cpp_lib_format_ranges` | 202207L | `<format>`
`__cpp_lib_formatters` | 202302L | `<stacktrace>` `<thread>`
`__cpp_lib_forward_like` | 202207L | `<utility>`
`__cpp_lib_gcd_lcm` | 201606L | `<numeric>`
`__cpp_lib_generator` | 202207L | `<generator>`
`__cpp_lib_generic_associative_lookup` | 201304L | `<map>` `<set>`
`__cpp_lib_generic_unordered_lookup` | 201811L | `<unordered_map>` `<unordered_set>`
`__cpp_lib_hardware_interference_size` | 201703L | `<new>`
`__cpp_lib_has_unique_object_representations` | 201606L | `<type_traits>`
`__cpp_lib_hypot` | 201603L | `<cmath>`
`__cpp_lib_incomplete_container_elements` | 201505L | `<forward_list>` `<list>` `<vector>`
`__cpp_lib_int_pow2` | 202002L | `<bit>`
`__cpp_lib_integer_comparison_functions` | 202002L | `<utility>`
`__cpp_lib_integer_sequence` | 201304L | `<utility>`
`__cpp_lib_integral_constant_callable` | 201304L | `<type_traits>`
`__cpp_lib_interpolate` | 201902L | `<cmath>` `<numeric>`
`__cpp_lib_invoke` | 201411L | `<functional>`
`__cpp_lib_invoke_r` | 202106L | `<functional>`
`__cpp_lib_ios_noreplace` | 202207L | `<ios>`
`__cpp_lib_is_aggregate` | 201703L | `<type_traits>`
`__cpp_lib_is_constant_evaluated` | 201811L | `<type_traits>`
`__cpp_lib_is_final` | 201402L | `<type_traits>`
`__cpp_lib_is_implicit_lifetime` | 202302L | `<type_traits>`
`__cpp_lib_is_invocable` | 201703L | `<type_traits>`
`__cpp_lib_is_layout_compatible` | 201907L | `<type_traits>`
`__cpp_lib_is_nothrow_convertible` | 201806L | `<type_traits>`
`__cpp_lib_is_null_pointer` | 201309L | `<type_traits>`
`__cpp_lib_is_pointer_interconvertible` | 201907L | `<type_traits>`
`__cpp_lib_is_scoped_enum` | 202011L | `<type_traits>`
`__cpp_lib_is_swappable` | 201603L | `<type_traits>`
`__cpp_lib_jthread` | 201911L | `<stop_token>` `<thread>`
`__cpp_lib_latch` | 201907L | `<latch>`
`__cpp_lib_launder` | 201606L | `<new>`
`__cpp_lib_list_remove_return_type` | 201806L | `<forward_list>` `<list>`
`__cpp_lib_logical_traits` | 201510L | `<type_traits>`
`__cpp_lib_make_from_tuple` | 201606L | `<tuple>`
`__cpp_lib_make_reverse_iterator` | 201402L | `<iterator>`
`__cpp_lib_make_unique` | 201304L | `<memory>`
`__cpp_lib_map_try_emplace` | 201411L | `<map>`
`__cpp_lib_math_constants` | 201907L | `<numbers>`
`__cpp_lib_math_special_functions` | 201603L | `<cmath>`
`__cpp_lib_mdspan` | 202207L | `<mdspan>`
`__cpp_lib_memory_resource` | 201603L | `<memory_resource>`
`__cpp_lib_modules` | 202207L |
`__cpp_lib_move_iterator_concept` | 202207L | `<iterator>`
`__cpp_lib_move_only_function` | 202110L | `<functional>`
`__cpp_lib_node_extract` | 201606L | `<map>` `<set>` `<unordered_map>` `<unordered_set>`
`__cpp_lib_nonmember_container_access` | 201411L | `<array>` `<deque>` `<forward_list>` `<iterator>` `<list>` `<map>` `<regex>` `<set>` `<string>` `<unordered_map>` `<unordered_set>` `<vector>`
`__cpp_lib_not_fn` | 201603L | `<functional>`
`__cpp_lib_null_iterators` | 201304L | `<iterator>`
`__cpp_lib_optional` | 202110L | `<optional>`
`__cpp_lib_out_ptr` | 202106L | `<memory>`
`__cpp_lib_parallel_algorithm` | 201603L | `<algorithm>` `<numeric>`
`__cpp_lib_polymorphic_allocator` | 201902L | `<memory_resource>`
`__cpp_lib_print` | 202207L | `<print>` `<ostream>`
`__cpp_lib_quoted_string_io` | 201304L | `<iomanip>`
`__cpp_lib_ranges` | 202302L | `<algorithm>` `<functional>` `<iterator>` `<memory>` `<ranges>`
`__cpp_lib_ranges_as_const` | 202207L | `<ranges>`
`__cpp_lib_ranges_as_rvalue` | 202207L | `<ranges>`
`__cpp_lib_ranges_cartesian_product` | 202207L | `<ranges>`
`__cpp_lib_ranges_chunk` | 202202L | `<ranges>`
`__cpp_lib_ranges_chunk_by` | 202202L | `<ranges>`
`__cpp_lib_ranges_contains` | 202207L | `<algorithm>`
`__cpp_lib_ranges_enumerate` | 202302L | `<ranges>`
`__cpp_lib_ranges_find_last` | 202207L | `<algorithm>`
`__cpp_lib_ranges_fold` | 202207L | `<algorithm>`
`__cpp_lib_ranges_iota` | 202202L | `<numeric>`
`__cpp_lib_ranges_join_with` | 202202L | `<ranges>`
`__cpp_lib_ranges_repeat` | 202207L | `<ranges>`
`__cpp_lib_ranges_slide` | 202202L | `<ranges>`
`__cpp_lib_ranges_starts_ends_with` | 202106L | `<algorithm>`
`__cpp_lib_ranges_stride` | 202207L | `<ranges>`
`__cpp_lib_ranges_to_container` | 202202L | `<ranges>`
`__cpp_lib_ranges_zip` | 202110L | `<ranges>` `<tuple>` `<utility>`
`__cpp_lib_raw_memory_algorithms` | 201606L | `<memory>`
`__cpp_lib_reference_from_temporary` | 202202L | `<type_traits>`
`__cpp_lib_remove_cvref` | 201711L | `<type_traits>`
`__cpp_lib_result_of_sfinae` | 201210L | `<functional>` `<type_traits>`
`__cpp_lib_robust_nonmodifying_seq_ops` | 201304L | `<algorithm>`
`__cpp_lib_sample` | 201603L | `<algorithm>`
`__cpp_lib_scoped_lock` | 201703L | `<mutex>`
`__cpp_lib_semaphore` | 201907L | `<semaphore>`
`__cpp_lib_shared_mutex` | 201505L | `<shared_mutex>`
`__cpp_lib_shared_ptr_arrays` | 201707L | `<memory>`
`__cpp_lib_shared_ptr_weak_type` | 201606L | `<memory>`
`__cpp_lib_shared_timed_mutex` | 201402L | `<shared_mutex>`
`__cpp_lib_shift` | 202202L | `<algorithm>`
`__cpp_lib_smart_ptr_for_overwrite` | 202002L | `<memory>`
`__cpp_lib_source_location` | 201907L | `<source_location>`
`__cpp_lib_span` | 202002L | `<span>`
`__cpp_lib_spanstream` | 202106L | `<spanstream>`
`__cpp_lib_ssize` | 201902L | `<iterator>`
`__cpp_lib_stacktrace` | 202011L | `<stacktrace>`
`__cpp_lib_start_lifetime_as` | 202207L | `<memory>`
`__cpp_lib_starts_ends_with` | 201711L | `<string>` `<string_view>`
`__cpp_lib_stdatomic_h` | 202011L | `<stdatomic.h>`
`__cpp_lib_string_contains` | 202011L | `<string>` `<string_view>`
`__cpp_lib_string_resize_and_overwrite` | 202110L | `<string>`
`__cpp_lib_string_udls` | 201304L | `<string>`
`__cpp_lib_string_view` | 201803L | `<string>` `<string_view>`
`__cpp_lib_syncbuf` | 201803L | `<syncstream>`
`__cpp_lib_three_way_comparison` | 201907L | `<compare>`
`__cpp_lib_to_address` | 201711L | `<memory>`
`__cpp_lib_to_array` | 201907L | `<array>`
`__cpp_lib_to_chars` | 201611L | `<charconv>`
`__cpp_lib_to_underlying` | 202102L | `<utility>`
`__cpp_lib_transformation_trait_aliases` | 201304L | `<type_traits>`
`__cpp_lib_transparent_operators` | 201510L | `<memory>` `<functional>`
`__cpp_lib_tuple_like` | 202207L | `<utility>` `<tuple>` `<map>` `<unordered_map>`
`__cpp_lib_tuple_element_t` | 201402L | `<tuple>`
`__cpp_lib_tuples_by_type` | 201304L | `<utility>` `<tuple>`
`__cpp_lib_type_identity` | 201806L | `<type_traits>`
`__cpp_lib_type_trait_variable_templates` | 201510L | `<type_traits>`
`__cpp_lib_uncaught_exceptions` | 201411L | `<exception>`
`__cpp_lib_unordered_map_try_emplace` | 201411L | `<unordered_map>`
`__cpp_lib_unreachable` | 202202L | `<utility>`
`__cpp_lib_unwrap_ref` | 201811L | `<type_traits>`
`__cpp_lib_variant` | 202106L | `<variant>`
`__cpp_lib_void_t` | 201411L | `<type_traits>`
Total number of macros: 185

### Notes

Each value in "Value" column follows the pattern: "yyyymmL", where "yyyy" is a year, and "mm" is a month when the corresponding feature-set was accepted for standardization. Some values where increased since the time of their introduction, if capabilities of given feature where extended. The table above contains only the most recent values (that is, taken from the latest C++ language draft standard). A full set of values, including the initial and intermediate ones, can be found in this table.

### See also

Feature testing (C++20) | A set of preprocessor macros to test the corresponding to C++ language and library features

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/feature_test&oldid=150115"