Migración C++20

Plan de migración C++20

Plan de implementación para elevar firelands-next de C++17 a C++20.

Estado: Fase 1 completa (2026-05-18) — CMAKE_CXX_STANDARD 20 en raíz; targets de tools usan cxx_std_20. Fase 2 (adopción incremental de features) abierta.

Checklist Fase 1 ✅

  • CMakeLists.txt raíz: CMAKE_CXX_STANDARD 20
  • Todos los CMakeLists.txt de tools: cxx_std_20
  • Docs de desarrollador y guía de agentes actualizados
  • SPDLOG_USE_STD_FORMAT (fmt bundled en spdlog 1.14.1 falla en C++20 / Apple Clang)
  • Build de prueba: auth + world en macOS
  • std::span en ByteBuffer (Append/Read/AsSpan/UnreadSpan)
  • Coroutines Boost.Asio C++20 en infrastructure/network/
  • Builds de prueba en matriz completa de compiladores (Linux GCC/Clang, Windows MSVC)
  • Fase 2 restante: designated initializers, using enum

Objetivos

ObjetivoJustificación
Estándar únicoUn CMAKE_CXX_STANDARD para auth, world, bibliotecas, pruebas, tools
Código más seguroFeatures C++20 reducen bugs sin cambiar arquitectura
PortabilidadWindows (MSVC/MinGW), Linux (GCC/Clang), macOS (Apple Clang)
Despliegue incrementalCambio de flag primero, features en PRs posteriores

No objetivos

  • Migración C++23
  • Refactors grandes “porque C++20 lo permite”
  • std::format obligatorio en todas partes (mantener estilo fmt/spdlog inicialmente)
  • Cambiar APIs C de terceros (límites MariaDB, Lua, StormLib sin cambios)

Por qué migrar

ÁreaBeneficio C++20
Red / paquetesstd::span<const std::byte> — menos pares puntero raw + longitud
Domain / portsconcept para restricciones de prueba (opcional)
BoilerplateDesignated initializers; using enum para opcodes
Concurrenciastd::jthread + stop tokens para nuevos workers
I/O de redCoroutines reemplazan cadenas callback (hecho en infrastructure/network)

Matriz de compiladores (objetivo)

PlataformaCompiladorMínimo
LinuxGCC12
LinuxClang15
macOSApple Clang15 (Xcode 15+)
WindowsMSVCVS 2022 17.4+
WindowsMinGWGCC 12+ UCRT

Fase 2 — Adopción de features (incremental)

PrioridadFeatureDónde
P1 ✅std::spanshared/network/, ByteBuffer
P1Designated initializersNuevos structs en domain/, DTOs de config
P2using enumHeaders opcode en shared/network
P2Expansión constexprTamaños de paquete, constantes mágicas
P3std::rangesSolo código nuevo
P3std::formatFormateo fuera de hot-path
P4conceptTest doubles en tests/unit/
P4std::jthreadSolo nuevas tareas en background

Coroutines (red — completo)

Todo I/O en src/infrastructure/network/ usa co_await vía AsioAwaitables.h:

ComponentePatrones
AsyncNetworkServerAcceptLoop
AuthSessionReadLoop, WriteLoop
WorldSessionReadLoop, WriteLoop, TimeSyncLoop, hechizo diferido co_await
RestAuthServerasync_read / async_write
RealmLinkSession / RealmLinkOutboundBucles read/write + ping

Notas de dependencias

DependenciaRiesgo C++20Mitigación
spdlog 1.14.1MedioSPDLOG_USE_STD_FORMAT
FTXUI 5.0.0MedioTrial-build consolas
GoogleTest, yaml-cpp, MariaDB, Lua, StormLibBajoLímites API C sin cambios

Directrices de codificación (post-migración)

  1. Código nuevo puede usar features Fase 2; no restilizar masivamente C++17 funcional
  2. Reglas hexagonales sin cambios — sin headers infra en domain/
  3. PCH: añadir headers C++20 a PROJECT_PCH_HEADERS solo si hay ganancia medida
  4. Reviews: rechazar restyle solo-C++20 sin beneficio medible

Rollback

Revertir PR Fase 1 (CMake + flags doc) — código sin sintaxis solo-C++20 compila como C++17 de nuevo.

Relacionado