Espacios de nombres
Variantes

C++23

De cppreference.com
< cpp

La revisión actual del estándar C++.

Nuevas características del lenguaje

void f(int& x)
{
if (x)
goto END;
x = 42;
END:
}
  • Declaraciones de alias (using) en las declaraciones de inicialización (P2360R0), p.ej.
for (using T = int; T e : v)
/* ... */

Nuevas características de la biblioteca

Nuevos módulos

Nuevos encabezados

Encabezados de compatibilidad de C:

Características de la biblioteca

Servicios generales
  • std::expected: un nuevo tipo vocabulario para devolver el resultado de una función (<expected>) (P0323R12, P2549R1).
  • std::move_only_function: un envoltorio invocable solo movible (P0288R9).
  • std::bind_back: un envoltorio de llamada (P2387R3).
  • std::byteswap: invierte los bytes (P1272R4).
  • std::forward_like (P2445R1).
  • std::invoke_r: invoca un objeto Callable (P2136R3).
  • std::to_underlying: una función de servicio para obtener el valor subyacente de enum (P1682R3).
  • std::unreachable: una función para marcar código inalcanzable (P0627R6).
  • Operaciones monádicas (transform, or_else, y and_then) para std::optional (P0798R8) y std::expected (P2505R5).
  • std::tuple es compatible con otros objetos similares a tuplas (P2165R4).
  • Agregar argumentos por defecto para el constructor de reenvío de std::pair (P2718R0).
  • Especialización de std::basic_common_reference para std::reference_wrapper que produce tipos referencia (P2655R3).
Biblioteca de Corrutinas
Diagnóstico
Algoritmos, iteradores y rangos
  • Nuevos adaptadores de rango:
  • ranges::range_adaptor_closure: un auxiliar para cierres de adaptadores de rango definidos por el programa (P2387R3).
  • ranges::to: una función de conversión de rango (P1206R7).
  • Nuevos algoritmos restringidos de rangos :
    • ranges::starts_with y ranges::ends_with (P1659R3).
    • ranges::contains y ranges::contains_subrange (P2302R4).
    • ranges::find_last, ranges::find_last_if, y ranges::find_last_if_not (P1223R5).
    • ranges::iota, ranges::shift_left, y ranges::shift_right: versiones de rangos de algoritmos no restringidos (P2440R1).
    • ranges::fold_left etc.: algoritmos de pliegue de rangos (P2322R6).
  • Rectificación de iteradores constantes, centinelas y rangos, es decir, ranges::cbegin y otros servicios similares que devuelven iteradores constantes deberían estar completamente garantizadas incluso para vistas superficiales-const (como std::span) (P2278R4).
  • Hacer explícitos los constructores de múltiples parámetros de algunas vistas (P2711R1).
  • Iteradores de rangos como entradas para algoritmos de no-rangos (P2408R5).
  • Relajación de adaptadores de rango para permitir tipos solo-movibles (P2494R2).
Contenedores
  • std::mdspan: una referencia de array multidimensional no dueña (P0009R18, P2599R2, P2604R0, P2613R1, P2763R1).
  • Constructibilidad y asignabilidad de contenedores a partir de otros rangos compatibles (P1206R7).
  • std::flat_set, std::flat_multiset (P1222R4), std::flat_map, std::flat_multimap (P0429R9): conjuntos y mapas planos - adaptadores de contenedor que envuelven contenedores subyacentes, ordenados, de acceso aleatorio.
  • Permitir la construcción de pares de iteradores en std::stack y std::queue (P1425R4).
  • Sobrecargas de borrado heterogéneo para contenedores asociativos (P2077R2).
  • Contexto de no deducción para asignadores en guías de deducción de contenedores (P1518R2).
  • Requerir que std::span y std::basic_string_view sean trivialmente copiables (P2251R1).
Apoyo en tiempo de compilación
Gestión de memoria
  • std::out_ptr y std::inout_ptr: adaptadores de punteros inteligentes para interoperabilidad con C (P1132R7).
  • std::allocate_at_least y std::allocator::allocate_at_least (P0401R6).
  • std::start_lifetime_as: una función de gestión explícita de tiempo de vida para tipos de tiempo de vida implícito (P2590R2).
  • Prohibición de la especialización de usuario de std::allocator_traits (P2652R2).
Procesamiento de cadenas y texto
  • Nuevas funciones miembro y cambios en los tipos de cadenas:
    • std::basic_string::contains y std::basic_string_view::contains (P1679R3).
    • Deshabilitar la construcción desde nullptr para std::basic_string y std::basic_string_view (P2166R1).
    • Constructor de rango explícito para std::basic_string_view (P1989R2).
    • std::basic_string::resize_and_overwrite (P1072R10).
    • Sobrecarga de referencia r-valor de std::basic_string::substr para un pegado eficiente (P2438R2).
  • Formateo de rangos, tuplas, presentación de secuencias de escape de caracteres y cadenas, std::thread::id, y seguimiento de pila. (P2286R8) (P2585R1) (P2693R1).
E/S e impresión
  • Funciones de salida formateada std::print y std::println proporcionadas en el encabezado <print> (P2093R14).
  • Biblioteca spanstream (flujo de cadena basado en std::span) proporcionada en el encabezado <spanstream> (P0448R4).
  • Apoyo del modo exclusivo en std::fstreams (P2467R1).
  • Apoyo para imprimir volatile T*: std::basic_ostream::operator<<(const volatile void*) (P1147R1).

Características obsoletas

Características eliminadas
  • Apoyo de recolección de basura y detección de fugas basada en alcanzabilidad. (P2186R2).
  • Apoyo de literales de cadena ancha mixtos concatenación, por ejemplo, const auto* no = u"q" U"p" es incorrecto. (P2201R1).
  • Literales de caracteres anchos no codificables y literales de caracteres anchos múltiples, por ejemplo, wchar_t x = 'db' es incorrecto. (P2362R3).
Características obsoletas
  • std::aligned_storage y std::aligned_union (P1413R3).
  • std::numeric_limits::has_denorm (P2614R2).
Deprecaciones revertidas
  • El operator, (operador coma) en expresiones de subíndice (pero la semántica ha cambiado para admitir subíndices multidimensionales sobrecargables operator[]).
  • Algunos encabezados de C (los encabezados correspondientes <*.h> para compatibilidad con C) (P2340R1).

Informes de defectos

Apoyo del compilador

Artículo principal: Apoyo de C++23 en compiladores.

Características principales del lenguaje C++23

Característica de C++23
 
Ponencia(s)
 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
IBM XLC++
Sun/Oracle C++
Embarcadero C++ Builder
Cray
Portland Group (PGI)
Nvidia nvcc
Sufijo de literal para size_t (con signo) [https://wg21.link/P0330R8 [HTTPS://WG21.LINK/P0330R8
[1] P0330R8]]
11 13
Hacer () más opcional para lambdas [https://wg21.link/P1102R2 [HTTPS://WG21.LINK/P1102R2
[2] P1102R2]]
11 13 6.3
if consteval [https://wg21.link/P1938R3 [HTTPS://WG21.LINK/P1938R3
[3] P1938R3]]
12 14 6.3
Eliminar apoyo para recolección de basura [https://wg21.link/P2186R2 [HTTPS://WG21.LINK/P2186R2
[4] P2186R2]]
12
ID: Sintaxis de identificador de C++ usando el estándar Unicode anexo 31 [https://wg21.link/P1949R7 [HTTPS://WG21.LINK/P1949R7
[5] P1949R7]]
12 14
ID: Admitir atributos duplicados [https://wg21.link/P2156R1 [HTTPS://WG21.LINK/P2156R1
[6] P2156R1]]
11 13
Conversiones contextuales estrechantes en static_assert y constexpr if [https://wg21.link/P1401R5 [HTTPS://WG21.LINK/P1401R5
[7] P1401R5]]
9 13 (parcial)*
14
Recorte de espacios en blanco antes del empalme de línea [https://wg21.link/P2223R2 [HTTPS://WG21.LINK/P2223R2
[8] P2223R2]]
Hacer obligatorio la distribución del orden de declaración [https://wg21.link/P1847R4 [HTTPS://WG21.LINK/P1847R4
[9] P1847R4]]
Eliminar el modo mezclado de la concatenación de literales de cadena [https://wg21.link/P2201R1 [HTTPS://WG21.LINK/P2201R1
[10] P2201R1]]
Deducir [https://wg21.link/P0847R7 [HTTPS://WG21.LINK/P0847R7
[11] P0847R7]]
6.3
auto(x) y auto{x} [https://wg21.link/P0849R8 [HTTPS://WG21.LINK/P0849R8
[12] P0849R8]]
12
Cambiar ámbito del tipo de retorno al final de las lambdas [https://wg21.link/P2036R3 [HTTPS://WG21.LINK/P2036R3
[13] P2036R3]]
#elifdef y #elifndef [https://wg21.link/P2334R1 [HTTPS://WG21.LINK/P2334R1
[14] P2334R1]]
12 13
Variables no literal (y etiquetas y gotos) en las funciones constexpr [https://wg21.link/P2242R3 [HTTPS://WG21.LINK/P2242R3
[15] P2242R3]]
12 6.3
Codificación consistente de literales de carácter [https://wg21.link/P2316R2 [HTTPS://WG21.LINK/P2316R2
[16] P2316R2]]
Juegos de caracteres y codificaciones [https://wg21.link/P2314R4 [HTTPS://WG21.LINK/P2314R4
[17] P2314R4]]
Extender la instrucción de inicialización para admitir la declaración de alias [https://wg21.link/P2360R0 [HTTPS://WG21.LINK/P2360R0
[18] P2360R0]]
12 14
Operador de índice/subíndice multidimensional [https://wg21.link/P2128R6 [HTTPS://WG21.LINK/P2128R6
[19] P2128R6]]
12
Característica de C++23
 
Ponencia(s)
 
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
IBM XLC++
Sun/Oracle C++
Embarcadero C++ Builder
Cray
Portland Group (PGI)
Nvidia nvcc

Características de la biblioteca de C++23

Característica de C++23
 
Ponencia(s)
 
GCC libstdc++
Clang libc++
MSVC
Biblioteca Estándar
Apple Clang
Sun/Oracle C++
Biblioteca Estándar
Embarcadero C++ Builder
Biblioteca Estándar
Cray C++
Biblioteca Estándar
Biblioteca de seguimiento de pila. P0881R7 P2301R1 12 (parcial)*
14*
19.34*
<stdatomic.h>. P0943R6 12 15 19.31*

14.0.3*

std::is_scoped_enum. P1048R1 11 12 19.30*

13.0.0*

std::basic_string::contains(), std::basic_string_view::contains(). P1679R3 11 12 19.30*

13.0.0*

std::to_underlying. P1682R3 11 13 19.30*

13.1.6*

Relajación de los requisitos para std::chrono::time_point. P2212R2 N/A N/A N/A N/A
Proporcionar comentarios sobre el tamaño en la interfaz de asignador. P0401R6 16 15 19.30*

14.0.3*

<spanstream>: string-stream con búfer basado en std::span. P0448R4 12 19.31*
std::out_ptr(), std::inout_ptr(). P1132R8 14 19 19.30*
constexpr type_info::operator==(). P1328R1 12 17 19.33**
19.34*

15.0.0*

Constructores de par de iteradores para std::stack y std::queue. P1425R4 12 14 19.31*

14.0.3*

Contexto de no deducción para los asignadores en las guías de deducción de contenedores. P1518R2 12* 13* 19.31**

13.1.6**

ranges::starts_with() y ranges::ends_with(). P1659R3 16 17 (parcial)*
18
19.31*

16.0.0*

Prohibir la construcción de std::basic_string y std::basic_string_view desde nullptr. P2166R1 12 13 19.30*

13.1.6*

std::invoke_r(). P2136R3 12 17 19.31*

15.0.0*

Constructor de rangos para std::basic_string_view. P1989R2 11 14 19.30*

14.0.3*

Argumentos de plantilla por defecto para el constructor de reenvío de std::pair. P1951R1 14 14 19.30*

14.0.3*

Eliminar la recolección de basura y la detección de fugas basada en la accesibilidad (apoyo de biblioteca). P2186R2 12 14 19.30*

14.0.3*

zip: views::zip, views::zip_transform, views::adjacent, y views::adjacent_transform. P2321R2 13 15 (parcial)*
22
19.33*(parcial)***
19.37*

14.0.3*

Sobrecargas de borrado heterogéneo para contenedores asociativos. P2077R3 16 19.32*
std::byteswap(). P1272R4 12 14 19.31*

14.0.3*

Impresión de volatile T*. P1147R1 11.3 14 19.31*

14.0.3*

basic_string::resize_and_overwrite(). P1072R10 12 14 19.31*

14.0.3*

Operaciones monádicas para std::optional. P0798R8 12 14 19.32*

14.0.3*

std::move_only_function. P0288R9 12 19.32*
Agregar una especificación noexcept condicional a std::exchange. P2401R0 12 14 19.31*

14.0.3*

Requerir que std::span y std::basic_string_view sean TriviallyCopyable. P2251R1 19.31*
Aclarar el estado de los “encabezados de C”. P2340R1
<expected>. P0323R12 P2549R1 12 16 19.33*

15.0.0*

constexpr para <cmath> y <cstdlib>. P0533R9 4.6 (parcial)*
std::unreachable(). P0627R6 12 15 19.32*

14.0.3*

Desaconsejar el uso de std::aligned_storage y std::aligned_union. P1413R3 13 16 19.33*
std::reference_constructs_from_temporary y std::reference_converts_from_temporary. P2255R2 13 (parcial)*
14
21 (parcial)* <span title="número de versión desconocido">19.51*
constexpr std::unique_ptr. P2273R3 12 16 19.33*

15.0.0*

Construcción de contenedores y cadenas a partir de rangos con ranges::to(), constructores etiquetados, funciones miembro insert y assign P1206R7 14 (parcial)*
15
17 19.34*

15.0.0*

Apoyo de tuberías para adaptadores de rango definidos por el usuario (ranges::range_adaptor_closure, std::bind_back). P2387R3 13 (parcial)*
14
19 19.34*
ranges::iota(), ranges::shift_left(), y ranges::shift_right(). P2440R1 13 (parcial)*
16
23 19.34*
views::join_with P2441R2 13 21 19.34*
views::chunk y views::slide. P2442R1 13 19.33*
views::chunk_by. P2443R1 13 18 19.33*

16.0.0*

std::mdspan: una referencia a un array multidimensional sin propiedad. P0009R18 P2599R2 P2604R0 P2613R1 P2763R1 16 17 (parcial)*
18
19.39*

15.0.0*

<flat_map>. P0429R9 15 20 <span title="número de versión desconocido">19.51*
<flat_set>. P1222R4 15 21 <span title="número de versión desconocido">19.51*
ranges::find_last(), ranges::find_last_if(), y ranges::find_last_if_not(). P1223R5 13 19 19.36*
Biblioteca independiente: <utility>, <ranges>, y <iterator> sencillos. P1642R11 13* 19.38*
views::stride. P1899R3 13 23 19.34*
Compatibilidad entre std::tuple y objetos similares a tuplas. P2165R4 14 2.9 (parcial)* 19.36* (parcial)*
19.37*
parcial*
Corrección de iteradores constantes, centinelas y rangos. views::as_const. P2278R4 13 19.35* (parcial)*
19.36*
Formato a rangos. P2286R8 15 16 19.37*(parcial)*
19.39*(parcial)*
19.41*(parcial)*
19.42*

15.0.0*

Mejorar el formato por defecto de formato de contenedores. P2585R1 15 16 (parcial)*
17
19.42*

15.0.0*

Biblioteca de salida formateada <print>. P2093R14 P2539R4 14 17 (parcial)*
18
19.37*

15.0.0**
16.0.0*

Formato para std::thread::id y std::stacktrace P2693R1 14 17 (parcial)* 19.38*

15.0.0*

constexpr para sobrecargas integrales de std::to_chars() y std::from_chars(). P2291R3 13 16 19.34*

15.0.0*

ranges::contains() y ranges::contains_subrange(). P2302R4 13 19 19.34*

16.0.0**

Algoritmos de pliegue para rangos. P2322R6 13 23
18 (parcial)*
19.35*
views::cartesian_product. P2374R4 P2540R1 13 19.37*
Añadir apoyo para tipos de solo movimiento a los conceptos de comparación (equality_comparable, totally_ordered, three_way_comparable). P2404R3 16 22 19.36*
Iteradores de rangos como entradas para algoritmos que no operan con rangos. P2408R5 16 19.34*
constexpr std::bitset. P2417R2 13 16 19.34*

15.0.0*

basic_string::substr() &&. P2438R2 16 16 19.34*

15.0.0*

views::as_rvalue. P2446R2 13 16 19.34*

15.0.0*

Módulos de la biblioteca estándar. P2465R3 15* 17 (parcial)* 19.35*
(parcial)*
19.36*
std::forward_like(). P2445R1 14 16 19.34*

15.0.0*

Compatibilidad con el modo exclusivo para std::fstream. P2467R1 12 18 19.36*

16.0.0*

views::repeat. P2474R2 13 17 19.36*

15.0.0*

Relajamiento de los adaptadores de rango para permitir tipos de solo movimiento. P2494R2 14 17 19.34*

15.0.0*

El constructor de rango de std::basic_string_view debería ser explicit. P2499R0 12.2 16 19.34*

15.0.0*

std::generator: generador de corrutinas síncronas para rangos. P2502R2 P2787R0 14 19.43*
Agregar una especificación noexcept condicional a std::apply. P2517R1 10 18 19.34*

16.0.0*

Gestión explícita del tiempo de vida (std::start_lifetime_as). P2590R2 P2679R2 16 <span title="número de versión desconocido">19.51*
Aclarar el manejo de codificaciones en el formateo de configuración regional de tipos chrono. P2419R2 15* 19.34**
std::move_iterator no debería ser siempre un input_iterator. P2520R0 12.3* 17* 19.34**

15.0.0*

Actualización de guías de deducción para operadores de llamada con parámetro de objeto explícito parámetro de objeto explícito. LWG3617 14 19.34*
Actualización de guías de deducción para static operator(). P1169R4 13 16 19.39*

15.0.0*

Nombres estándar y apoyo de biblioteca para tipos de punto flotante extendidos. P1467R9 13 19.37**
Operaciones monádicas para std::expected. P2505R5 13 17 19.36*

15.0.0*

views::enumerate. P2164R9 13 23 19.37*
std::is_implicit_lifetime. P2674R1 16 20 <span title="número de versión desconocido">19.51*
std::common_reference_t de std::reference_wrapper debería ser un tipo referencia. P2655R3 16 21* 19.37*
Prohibir la especialización de usuario de std::allocator_traits P2652R2 19 19.37*
Desaconsejar el uso de std::numeric_limits::has_denorm. P2614R2 17 18 19.37*

16.0.0*

Hacer los constructores de múltiples parámetros de views explicit. P2711R1 16 21
17 (parcial)*
19.36**

15.0.0*

DR20: Relajamiento de rangos solo un poquito. P2609R3 15 20 19.37*
DR20: Almacenamiento de iteradores para un aplanamiento adecuado. P2770R0 14 21
18 (parcial)
19.37*
DR17: std::visit() para clases derivadas de std::variant. P2162R2 11.3 13 19.20**
19.30*

13.1.6*

DR20: Rangos prestados condicionalmente. P2017R1 11 16 19.30*
DR20: Reparar adaptadores de rango de entrada y std::counted_iterator. P2259R1 12 19.30*(parcial)*
19.31*
DR20: views::join debería unir todas las vistas de rangos. P2328R1 11.2 15 19.30*

14.0.3*

DR20: view no requiere default_initializable. P2325R3 11.3 16 19.30*

15.0.0*

DR20: Los objetos adaptadores de rango vinculan argumentos por valor. P2281R1 11 14 19.29 (16.10)*
(parcial)*
19.31*

14.0.3*

DR20: constexpr para std::optional y std::variant. P2231R1 11.3 (parcial)*
12
13 (parcial)*
19
19.31*

13.1.6* (parcial)

DR20: views::lazy_split y se rediseñó views::split. P2210R2 12 16 19.31*

15.0.0*

DR20: Fix ranges::istream_view P2432R1 12 16 19.31*

15.0.0*

DR20: view con propiedad. P2415R2 12 14 19.31*

14.0.3*

DR20: Arreglar el manejo de configuraciones regionales en los formateadores de chrono. P2372R3 P2418R2 13 19.31*
DR20: Limpieza de tipos de clase enteros. P2393R1 19.32*
DR20: Comprobaciones de cadenas de formato en tiempo de compilación; reducción del tamaño binario de la familia std::format(). P2216R3 13 14 (parcial)*
15
19.32*

14.0.3*

DR20: Añadir apoyo para tipos const no formateables a std::format. P2418R2 13 15 19.32*

14.0.3*

DR20: std::basic_format_string. P2508R1 13 15 19.35*

14.0.3*

DR20: Las pastillas venenosas son demasiado tóxicas. P2602R2 14 19 19.36*
DR20: Tolerancia de caracteres de relleno de std::format. P2572R1 14 17 19.37*
DR20: Mejora de la estimación de ancho de std::format. P2675R1 14 17 19.38*
DR20: Garantías de finalización de fase de std::barrier P2588R3 19.28 (16.8)**
19.36*
Característica de C++23
 
Ponencia(s)
 
GCC libstdc++
Clang libc++
MSVC
Biblioteca Estándar
Apple Clang
Sun/Oracle C++
Biblioteca Estándar
Embarcadero C++ Builder
Biblioteca Estándar
Cray C++
Biblioteca Estándar

* - planea sobre el número de versión para ver las notas

Enlaces externos

  C++23 - Wikipedia