22 puntos por GN⁺ 2026-03-31 | 7 comentarios | Compartir por WhatsApp
  • C++26 quedó oficialmente completado. Incluye cuatro funciones clave: reflexión, mayor seguridad de memoria, contratos (Contracts) y std::execution
  • La reflexión en tiempo de compilación es el motor de abstracción más potente en la historia de C++ desde la introducción de las plantillas, y permite que el lenguaje se describa a sí mismo y genere código
  • Con solo recompilar el código C++ existente para C++26, se elimina el comportamiento indefinido (UB) de las variables locales no inicializadas, y la biblioteca estándar reforzada garantiza seguridad de límites
  • En despliegues dentro de Google, se midieron más de 1,000 errores corregidos y una reducción del 30% en los segfaults en producción
  • Se espera una rápida adopción por parte de las implementaciones de compiladores, ya que GCC ya fusionó reflexión y contratos en trunk

C++26 está listo: la versión más importante desde C++11

  • En la reunión del comité ISO C++ celebrada en Croydon, Londres, Reino Unido, se completó definitivamente el trabajo técnico de C++26
    • Asistieron unas 210 personas (130 presenciales, 80 remotas por Zoom), con representantes oficiales de 24 países
    • La mayor parte de la reunión se dedicó a procesar 411 comentarios internacionales (etapa CD) recibidos durante el verano
    • Se enfocó en pulir y completar detalles (fit-and-finish), sin agregar ni eliminar funciones nuevas
  • El C++26 finalizado en esta reunión entra ahora en la etapa de redacción del documento final para la votación de aprobación internacional (DIS)

Las 4 funciones clave de C++26

(1) Reflexión (Reflection)

  • Es la mayor actualización en la historia del desarrollo de C++ desde la invención de las plantillas, al permitir que el lenguaje se describa a sí mismo y genere código
  • En junio de 2025, el comité de C++ incluyó la reflexión en tiempo de compilación en el borrador de C++26, marcando un punto de inflexión en la historia del lenguaje
  • Se la presenta como "el nuevo motor más potente para expresar abstracciones eficientes, y harán falta los próximos 10 años para descubrir de qué es capaz este cohete"

(2) Mayor seguridad de memoria

  • Con solo recompilar, C++26 elimina toda una categoría de UB (comportamiento indefinido) en código C++ existente: la lectura de variables locales no inicializadas
  • Se estandariza la biblioteca estándar reforzada (Hardened Standard Library), que garantiza seguridad de límites para tipos principales como vector, span, string y string_view
    • El sobrecosto de rendimiento medido es de 0.3% en promedio (menos de 1%)
    • Ya fue desplegada en cientos de millones de líneas de código en plataformas de Apple y servicios de Google
  • Resultados del despliegue en Google:
    • Más de 1,000 errores corregidos
    • Se proyecta prevenir entre 1,000 y 2,000 errores por año
    • 30% menos segfaults en toda la producción
    • De todo el código C++ de Google, solo 5 servicios hicieron opt-out total, y solo 7 ubicaciones usan APIs de acceso inseguro

(3) Contratos (Contracts): pre, post, contract_assert

  • C++26 incorpora contratos a nivel de lenguaje: precondiciones (precondition), postcondiciones (postcondition) y sentencias de aserción en declaraciones de funciones
  • Se considera una capacidad mucho más potente que el macro assert de C
  • Resultado de las votaciones sobre la adopción de contratos:
    • Febrero de 2025 (fusión en el working draft): 100 a favor, 14 en contra, 12 abstenciones
    • Marzo de 2026 (aprobación final para C++26): 114 a favor, 12 en contra, 3 abstenciones
  • Aunque persistieron preocupaciones técnicas de algunos expertos del comité, el tema se debatió suficientemente a lo largo de tres reuniones y múltiples teleconferencias
  • Antes de la reunión de noviembre de 2025, ya se habían corregido 2 errores en la especificación de contratos incorporando feedback

(4) std::execution (Sender/Receiver)

  • Es el modelo asíncrono de C++, un marco unificado para expresar y controlar concurrencia y paralelismo
  • Permite escribir fácilmente structured concurrency (concurrencia con ciclos de vida estrictamente anidados), lo que aporta propiedades de seguridad para prevenir estructuralmente las condiciones de carrera (data race)
  • Atención: la documentación aún es insuficiente y la biblioteca "fingers-and-toes" sigue siendo limitada, por lo que su adopción es más difícil que la de otras funciones de C++
    • Puede ser necesario contar con ayuda de expertos que ya la conozcan bien y escribir bibliotecas adaptadoras para integrarla con código asíncrono existente

Por qué se espera una adopción rápida de C++26

  • Es el conjunto de funciones más demandado desde C++11, e incluye reflexión y mejoras de seguridad que la mayoría de los desarrolladores de C++ usarán en su trabajo diario
    • Se considera que el STL paralelo, conceptos (concepts), corrutinas y módulos de C++17, C++20 y C++23 no tuvieron un impacto tan amplio para todos los desarrolladores de C++ como sí lo tuvo C++11
  • GCC y Clang mantuvieron durante todo el desarrollo de C++26 un estado de implementación previa de dos tercios de las funciones
    • GCC ya fusionó reflexión y contratos en trunk, y están a la espera de lanzamiento

Comienza el trabajo de C++29: profundizar la seguridad de memoria

  • En esta reunión también se aprobó el calendario de C++29, manteniendo el ciclo de lanzamientos cada 3 años
  • Se confirmó que el foco principal de C++29 será seguir reforzando la seguridad de tipos y memoria
    • Se están evaluando propuestas para reducir aún más el comportamiento indefinido (UB)
    • En SG23 (subgrupo de seguridad y protección) ya se trabaja con base en el perfil de seguridad de tipos P3984 de Bjarne Stroustrup y el marco general de perfiles de Gabriel Dos Reis
  • Oliver Hunt, de Apple, presentó P4158R0 "Subsetting and restrictions for C++ for memory safety"
    • Se aplicó un enfoque de subset-of-superset a más de 4 millones de líneas de código de WebKit
    • Se reportó que "bloquea múltiples clases de vulnerabilidades, y que la política actual habría evitado la mayoría de los exploits del pasado"
  • El tema de seguridad de memoria se debatió en profundidad tanto en la sesión del miércoles por la noche, con asistencia de la mayoría del comité, como en la sesión exclusiva de EWG del viernes por la tarde, con unas 90 personas
  • La biblioteca de cantidades y unidades (P3045R7 "Quantities and units library") avanzó desde SG6 y SG18 hacia LEWG (subgrupo principal de evolución de bibliotecas)

Próximos pasos

  • Las próximas dos reuniones se celebrarán en Brno, República Checa (junio) y en Búzios, Río de Janeiro, Brasil (noviembre)
  • En ambas reuniones comenzarán los trabajos de incorporación de funciones al working draft de C++29
  • Desde ahora y hasta la próxima reunión, ya hay programadas numerosas teleconferencias de subgrupos

7 comentarios

 
roxie 28 일 전

zzz

 
GN⁺ 2026-03-31
Opiniones en Hacker News
  • Es una lástima que la función de Contracts haya sido adoptada como estándar en C++
    Da la sensación de agregar todavía más complejidad a un lenguaje que ya llegó a su límite en ese aspecto
    Incluso Bjarne Stroustrup describió esta función como un “diseño incompleto e inflado al estilo de un comité”
    También creo que tiene demasiados riesgos como herramienta peligrosa (footgun), así que su justificación me parece débil

    • Yo mismo implementé una extensión de Contracts para C++ a inicios de los 90
      Pero a nadie le interesó
      El material relacionado está aquí
    • Mucha gente dice que “C++ es demasiado complejo”, pero es interesante que cada quien piensa en funciones complejas distintas
    • Puede que el diseño de Contracts en C++ esté mal, pero creo que el concepto en sí es indispensable para la evolución del lenguaje
      Es un elemento clave para integrarse con la verificación formal (proof assistant) como en Ada o Rust, y permitir validación estática en lugar de pruebas
      Vale la pena revisar Ada Spark
    • La documentación sobre Contracts es demasiado confusa
      El primer ejemplo en la documentación de cppreference es, de hecho, un caso excepcional que modifica el estado
      La sintaxis tampoco es intuitiva
      Por ejemplo, una forma como asserts_pre(num >= 0) habría sido mucho más clara que pre(num >= 0)
      Pero parece que se priorizó la brevedad
    • Los Contracts no hacen más que estandarizar algo que los desarrolladores de C++ ya venían haciendo de manera informal
      Más que agregar complejidad, unifican implementaciones dispersas y mejoran la interoperabilidad
      De hecho, creo que funciones como Reflection sí añaden más complejidad
  • Como desarrollador de C# y Java, tengo curiosidad
    Me gustaría saber qué tipo de aplicaciones se hacen hoy en día con C++
    No suele haber muchas oportunidades de escuchar qué problemas resuelve en la práctica

  • Me parece interesante la redefinición de “erroneous behavior” para variables no inicializadas
    Según el documento del estándar, esto genera un costo en tiempo de ejecución,
    y usando el atributo [[indeterminate]] se puede volver a undefined behavior

    int x [[indeterminate]];
    std::cin >> x;
    
    • El lenguaje D inicializa automáticamente todas las variables
      Si de verdad no quieres inicializar una, tienes que escribirlo explícitamente, como int x = void;
      Es casi imposible hacerlo por accidente
    • Leyendo el documento por encima, hay dos cosas que sorprenden
      1. No queda claro qué significa exactamente “un valor determinado de forma independiente”: ¿se rellena con 0 o con un valor arbitrario de memoria?
      2. Me pregunto por qué [[indeterminate]] hace que se vuelva otra vez a UB (Undefined Behavior)
    • Probablemente esta función se pueda controlar con una bandera del compilador
      Algunos proyectos seguramente seguirán prefiriendo la inicialización manual
    • Pensar en la persona que más tarde verá [[indeterminate]] en el código es terrible
      Al final perderá tiempo buscando qué significa o terminará ignorándolo
      Me recuerda a cuando en Rust había tantos genéricos y traits que se volvía difícil leer el código
  • Trabajé en el equipo de C++ de MS en los 90
    En ese entonces pensaba que RTTI era el límite del sistema de reflexión que C++ podía llegar a tener
    Sorprende ver hasta dónde ha avanzado ahora

  • Hacer la reunión en Croydon y no dejar salir a nadie hasta que firmaran fue una estrategia bastante astuta
    No me gustaría volver a trabajar ahí

  • Tenía curiosidad por el estado de implementación de C++26 en GCC y Clang
    GCC ya fusionó reflection y contracts en trunk, pero quería saber hasta dónde va Clang

    • En la página de estado de Clang, ambos aparecen como “no”,
      mientras que en la página de GCC figuran como “yes”
    • Bloomberg publicó una implementación de reflection para Clang aquí
      Ya se puede usar incluso en Compiler Explorer, y se está aprovechando para añadir reflection a simdjson
  • Me pregunto si los cambios al sistema de módulos en este estándar realmente harán que se use más

    • Creo que el grupo WG de C++ debería concentrarse хотя sea una vez en módulos y empaquetado, en lugar de seguir agregando funciones nuevas
      Esa es justamente la razón por la que Cargo de Rust supera con tanta claridad a C++
      El hecho de no poder añadir una dependencia con una sola línea como cargo add aleja a las nuevas generaciones
    • La mayoría de los compiladores todavía no soportan header unit
      Si CMake adopta el modelo de compilación en dos etapas de Clang, la velocidad de compilación mejorará muchísimo,
      y recién entonces los módulos empezarán a adoptarse de verdad
    • Creo que los módulos ya son una idea fracasada
      Es muy poco probable que logren volverse algo dominante
    • Sinceramente, ya quisiera que dejaran de desarrollar C++
      Hay demasiadas funciones nuevas y es difícil seguirles el ritmo
      El sistema de build también es un desastre, y los archivos de encabezado ya deberían desaparecer
  • No tiene mucho que ver con el tema, pero la expresión “London Croydon” suena rara
    ¿No sería más normal decir “Croydon, London”?

    • También existen expresiones invertidas comunes como “London Gatwick Airport”
      Al planear un viaje, suele sentirse más natural leer del área grande a la pequeña
    • Hay gente que habla de lo específico primero y otra que empieza por lo general
      Probablemente lo escribieron como “London, Croydon” para dar la impresión de que “la reunión fue en Londres”
      “Croydon, London” suena más como “fue en Croydon, en las afueras de Londres”, así que luce menos elegante — una interpretación medio en broma
  • También hubo reacciones cínicas del tipo “salió justo antes de que el lenguaje fuera abandonado”

  • Si C++29 se enfocara solo en mejoras de calidad y pulir funciones existentes, probablemente la comunidad no se quejaría mucho

    • En lo personal, me bastaría con que C++29 trajera una función random() de una sola línea
    • Claro, la reacción de la comunidad dependerá de qué funciones se añadan
 
coldmonster91 28 일 전

Desde que sale un estándar de C++, hasta que se adopta en la industria, tienen que pasar más de 5 años para que recién se empiece a adoptar poco a poco... Es atractivo, pero al final es como algo inalcanzable :(

 
woonsa 29 일 전

En vez de agregar funciones para mejorar la seguridad de memoria, si tan solo se impidieran los punteros colgantes o las referencias mutables, la seguridad de memoria ya aumentaría; pero al contrario, con más funciones solo están elevando la complejidad del código.

 
tsboard 29 일 전

Me costó bastante pasarme a Rust, así que es alentador ver que el borrador del estándar C++26 incorpora muchas de las funciones que estaba esperando. Pero no voy a volver a C++... jaja

 
heal9179 29 일 전

Sobre el tema de empaquetado, sí están saliendo cosas del lado de CMake.. https://www.kitware.com/common-package-specification-is-out-the-gate/

 
heal9179 29 일 전

Los contracts eran una función que de verdad estaba esperando, y por fin llegó