cpp-20 标准
原文 https://en.cppreference.com/w/cpp/20
1. C++版本衍进
1.1 Core language features
| 特性 | 版本 | 说明 |
|---|---|---|
| auto and decltype | C++11 | auto类型推导与decltype |
| defaulted and deleted functions | C++11 | 显示默认和删除的函数 |
| final and override | C++11 | |
| trailing return type | C++11 | |
| rvalue references | C++11 | |
| move constructors and move assignment operators | C++11 | |
| scoped enums | C++11 | 强类型枚举 |
| constexpr and literal types | C++11 | |
| list initialization | C++11 | |
| delegating and inherited constructors | C++11 | |
| brace-or-equal initializers | C++11 | |
| nullptr | C++11 | 指针空值 |
| long long | C++11 | long long 整形 |
| char16_t and char32_t | C++11 | |
| type aliases | C++11 | |
| variadic templates | C++11 | |
| generalized (non-trivial) unions | C++11 | |
| generalized PODs (trivial types and standard-layout types) | C++11 | |
| Unicode string literals | C++11 | |
| user-defined literals | C++11 | |
| attributes | C++11 | |
| lambda expressions | C++11 | lambda 函数 |
| noexcept specifier and noexcept operator | C++11 | |
| alignof and alignas | C++11 | |
| multithreaded memory model | C++11 | |
| thread-local storage | C++11 | |
| GC interface | C++11 | |
| range-for (based on a Boost library) | C++11 | 基于范围的for语句 |
| static_assert (based on a Boost library) | C++11 | |
| variable templates | C++14 | |
| generic lambdas | C++14 | |
| lambda init-capture | C++14 | |
| new/delete elision | C++14 | |
| relaxed restrictions on constexpr functions | C++14 | |
| binary literals | C++14 | |
| digit separators | C++14 | |
| return type deduction for functions | C++14 | |
| aggregate classes with default non-static member initializers. | C++14 | |
| fold-expressions | C++17 | |
| class template argument deduction | C++17 | |
| non-type template parameters declared with auto | C++17 | |
| compile-time if constexpr | C++17 | |
| inline variables | C++17 | |
| structured bindings | C++17 | |
| initializers for if and switch | C++17 | |
| u8 character literal | C++17 | |
| simplified nested namespaces | C++17 | |
| using-declaration declaring multiple names | C++17 | |
| made noexcept part of type system | C++17 | |
| new order of evaluation rules | C++17 | |
| guaranteed copy elision | C++17 | |
| lambda capture of *this | C++17 | |
| constexpr lambda | C++17 | |
| attribute namespaces don’t have to repeat | C++17 | |
| new attributes:[[fallthrough]], [[nodiscard]], [[maybe_unused]] | C++17 | |
| __has_include | C++17 | |
| Feature test macros | C++20 | |
| 3-way comparison operator <=> and operator==() = default | C++20 | |
| designated initializers | C++20 | |
| init-statements and initializers in range-for | C++20 | |
| char8_t | C++20 | |
| New attributes: [[no_unique_address]], [[likely]], [[unlikely]] | C++20 | |
| pack-expansions in lambda init-captures | C++20 | |
| removed the requirement to use typename to disambiguate types in many contexts | C++20 | |
| consteval, constinit | C++20 | |
| further relaxed constexpr | C++20 | |
| signed integers are 2’s complement | C++20 | |
| aggregate initialization using parentheses | C++20 | |
| Coroutines | C++20 | |
| Modules | C++20 | |
| Constraints and concepts | C++20 | |
| Abbreviated function templates | C++20 | |
| DR: array new can deduce array size | C++20 |
2. GCC支持 10.2
C++ GENERAL
| 特征 | 实现 | 说明 |
|---|---|---|
| __cplusplus | 201402 | __cplusplus宏 1. |
| __cpp_exceptions | 199711 | |
| __cpp_rtti | 199711 |
C++11 CORE
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_alias_templates | 200704 | |
| __cpp_attributes | 200809 | |
| __cpp_constexpr | 201304 | |
| __cpp_decltype | 200707 | |
| __cpp_delegating_constructors | 200604 | |
| __cpp_inheriting_constructors | 201511 | |
| __cpp_initializer_lists | 200806 | |
| __cpp_lambdas | 200907 | |
| __cpp_nsdmi | 200809 | |
| __cpp_range_based_for | 200907 | |
| __cpp_raw_strings | 200710 | |
| __cpp_ref_qualifiers | 200710 | |
| __cpp_rvalue_references | 200610 | |
| __cpp_static_assert | 200410 | |
| __cpp_threadsafe_static_init | 200806 | |
| __cpp_unicode_characters | 200704 | |
| __cpp_unicode_literals | 200710 | |
| __cpp_user_defined_literals | 200809 | |
| __cpp_variadic_templates | 200704 |
C++14 CORE
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_aggregate_nsdmi | 201304 | |
| __cpp_binary_literals | 201304 | |
| __cpp_constexpr | 201304 | |
| __cpp_decltype_auto | 201304 | |
| __cpp_generic_lambdas | 201304 | |
| __cpp_init_captures | 201304 | |
| __cpp_return_type_deduction | 201304 | |
| __cpp_sized_deallocation | 201309 | |
| __cpp_variable_templates | 201304 |
C++14 LIB
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_lib_chrono_udls | 201304 | |
| __cpp_lib_complex_udls | 201309 | |
| __cpp_lib_exchange_function | 201304 | |
| __cpp_lib_generic_associative_lookup | 201304 | |
| __cpp_lib_integer_sequence | 201304 | |
| __cpp_lib_integral_constant_callable | 201304 | |
| __cpp_lib_is_final | 201402 | |
| __cpp_lib_is_null_pointer | 201309 | |
| __cpp_lib_make_reverse_iterator | 201402 | |
| __cpp_lib_make_unique | 201304 | |
| __cpp_lib_null_iterators | 201304 | |
| __cpp_lib_quoted_string_io | 201304 | |
| __cpp_lib_result_of_sfinae | 201210 | |
| __cpp_lib_robust_nonmodifying_seq_ops | 201304 | |
| __cpp_lib_shared_timed_mutex | 201402 | |
| __cpp_lib_string_udls | 201304 | |
| __cpp_lib_transformation_trait_aliases | 201304 | |
| __cpp_lib_transparent_operators | 201510 | |
| __cpp_lib_tuple_element_t | 201402 | |
| __cpp_lib_tuples_by_type | 201304 |
C++17 CORE
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_aggregate_bases | ||
| __cpp_aligned_new | ||
| __cpp_capture_star_this | ||
| __cpp_constexpr | 201304 | |
| __cpp_deduction_guides | ||
| __cpp_enumerator_attributes | ||
| __cpp_fold_expressions | ||
| __cpp_guaranteed_copy_elision | ||
| __cpp_hex_float | 201603 | |
| __cpp_if_constexpr | ||
| __cpp_inheriting_constructors | 201511 | |
| __cpp_inline_variables | ||
| __cpp_namespace_attributes | ||
| __cpp_noexcept_function_type | ||
| __cpp_nontype_template_args | ||
| __cpp_nontype_template_parameter_auto | ||
| __cpp_range_based_for | 200907 | |
| __cpp_static_assert | 200410 | |
| __cpp_structured_bindings | ||
| __cpp_template_template_args | ||
| __cpp_variadic_using |
C++17 LIB
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_lib_addressof_constexpr | ||
| __cpp_lib_allocator_traits_is_always_equal | 201411 | |
| __cpp_lib_any | ||
| __cpp_lib_apply | ||
| __cpp_lib_array_constexpr | ||
| __cpp_lib_as_const | ||
| __cpp_lib_atomic_is_always_lock_free | ||
| __cpp_lib_bool_constant | ||
| __cpp_lib_boyer_moore_searcher | ||
| __cpp_lib_byte | ||
| __cpp_lib_chrono | ||
| __cpp_lib_clamp | ||
| __cpp_lib_enable_shared_from_this | 201603 | |
| __cpp_lib_execution | ||
| __cpp_lib_filesystem | ||
| __cpp_lib_gcd_lcm | ||
| __cpp_lib_hardware_interference_size | ||
| __cpp_lib_has_unique_object_representations | ||
| __cpp_lib_hypot | ||
| __cpp_lib_incomplete_container_elements | 201505 | |
| __cpp_lib_invoke | ||
| __cpp_lib_is_aggregate | ||
| __cpp_lib_is_invocable | ||
| __cpp_lib_is_swappable | 201603 | |
| __cpp_lib_launder | ||
| __cpp_lib_logical_traits | ||
| __cpp_lib_make_from_tuple | ||
| __cpp_lib_map_try_emplace | ||
| __cpp_lib_math_special_functions | ||
| __cpp_lib_memory_resource | ||
| __cpp_lib_node_extract | ||
| __cpp_lib_nonmember_container_access | ||
| __cpp_lib_not_fn | ||
| __cpp_lib_optional | ||
| __cpp_lib_parallel_algorithm | ||
| __cpp_lib_raw_memory_algorithms | ||
| __cpp_lib_sample | ||
| __cpp_lib_scoped_lock | ||
| __cpp_lib_shared_mutex | ||
| __cpp_lib_shared_ptr_arrays | 201611 | |
| __cpp_lib_shared_ptr_weak_type | ||
| __cpp_lib_string_view | ||
| __cpp_lib_to_chars | ||
| __cpp_lib_transparent_operators | 201510 | |
| __cpp_lib_type_trait_variable_templates | ||
| __cpp_lib_uncaught_exceptions | 201411 | |
| __cpp_lib_unordered_map_try_emplace | ||
| __cpp_lib_variant | ||
| __cpp_lib_void_t | 201411 |
C++20 CORE
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_aggregate_paren_init | ||
| __cpp_char8_t | ||
| __cpp_concepts | ||
| __cpp_conditional_explicit | ||
| __cpp_consteval | ||
| __cpp_constexpr | 201304 | |
| __cpp_constexpr_dynamic_alloc | ||
| __cpp_constexpr_in_decltype | ||
| __cpp_constinit | ||
| __cpp_deduction_guides | ||
| __cpp_designated_initializers | ||
| __cpp_generic_lambdas | 201304 | |
| __cpp_impl_coroutine | ||
| __cpp_impl_destroying_delete | ||
| __cpp_impl_three_way_comparison | ||
| __cpp_init_captures | 201304 | |
| __cpp_modules | ||
| __cpp_nontype_template_args | ||
| __cpp_using_enum |
C++20 LIB
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_lib_array_constexpr | ||
| __cpp_lib_assume_aligned | ||
| __cpp_lib_atomic_flag_test | ||
| __cpp_lib_atomic_float | ||
| __cpp_lib_atomic_lock_free_type_aliases | ||
| __cpp_lib_atomic_ref | ||
| __cpp_lib_atomic_shared_ptr | ||
| __cpp_lib_atomic_value_initialization | ||
| __cpp_lib_atomic_wait | ||
| __cpp_lib_barrier | ||
| __cpp_lib_bind_front | ||
| __cpp_lib_bit_cast | ||
| __cpp_lib_bitops | ||
| __cpp_lib_bounded_array_traits | ||
| __cpp_lib_char8_t | ||
| __cpp_lib_chrono | ||
| __cpp_lib_concepts | ||
| __cpp_lib_constexpr_algorithms | ||
| __cpp_lib_constexpr_complex | ||
| __cpp_lib_constexpr_dynamic_alloc | ||
| __cpp_lib_constexpr_functional | ||
| __cpp_lib_constexpr_iterator | ||
| __cpp_lib_constexpr_memory | ||
| __cpp_lib_constexpr_numeric | ||
| __cpp_lib_constexpr_string | ||
| __cpp_lib_constexpr_string_view | ||
| __cpp_lib_constexpr_tuple | ||
| __cpp_lib_constexpr_utility | ||
| __cpp_lib_constexpr_vector | ||
| __cpp_lib_coroutine | ||
| __cpp_lib_destroying_delete | ||
| __cpp_lib_endian | ||
| __cpp_lib_erase_if | ||
| __cpp_lib_execution | ||
| __cpp_lib_format | ||
| __cpp_lib_generic_unordered_lookup | ||
| __cpp_lib_int_pow2 | ||
| __cpp_lib_integer_comparison_functions | ||
| __cpp_lib_interpolate | ||
| __cpp_lib_is_constant_evaluated | ||
| __cpp_lib_is_layout_compatible | ||
| __cpp_lib_is_nothrow_convertible | ||
| __cpp_lib_is_pointer_interconvertible | ||
| __cpp_lib_jthread | ||
| __cpp_lib_latch | ||
| __cpp_lib_list_remove_return_type | ||
| __cpp_lib_math_constants | ||
| __cpp_lib_polymorphic_allocator | ||
| __cpp_lib_ranges | ||
| __cpp_lib_remove_cvref | ||
| __cpp_lib_semaphore | ||
| __cpp_lib_shared_ptr_arrays | 201611 | |
| __cpp_lib_shift | ||
| __cpp_lib_smart_ptr_for_overwrite | ||
| __cpp_lib_source_location | ||
| __cpp_lib_span | ||
| __cpp_lib_ssize | ||
| __cpp_lib_starts_ends_with | ||
| __cpp_lib_string_view | ||
| __cpp_lib_syncbuf | ||
| __cpp_lib_three_way_comparison | ||
| __cpp_lib_to_address | ||
| __cpp_lib_to_array | ||
| __cpp_lib_type_identity | ||
| __cpp_lib_unwrap_ref |
C++23 CORE
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_size_t_suffix |
C++23 LIB
| 特征 | 实现 | 说明 |
|---|---|---|
| __cpp_lib_is_scoped_enum | ||
| __cpp_lib_stacktrace | ||
| __cpp_lib_stdatomic_h | ||
| __cpp_lib_string_contains |
ATTRIBUTES
| 特征 | 实现 | 说明 |
|---|---|---|
| carries_dependency | ||
| deprecated | 201309 | |
| fallthrough | 201603 | |
| likely | 201803 | |
| maybe_unused | 201603 | |
| nodiscard | 201907 | |
| noreturn | 200809 | |
| no_unique_address | 201803 | |
| unlikely | 201803 |
3. 例
3.1 __cplusplus
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
#ifdef __cplusplus
printf("cpp %dL\n", __cplusplus);
#else
printf("c\n");
#endif
return 0;
}
$ gcc a1.c
$ ./a.out
c
$ g++ a1.c
$ ./a.out
cpp 201402
$ g++ -std=c++98 a1.c
$ ./a.out
cpp 199711L
$ g++ -std=c++11 a1.c
$ ./a.out
cpp 201103L