C++26 incorpora al encabezado dos nuevos tipos de vocabulario definidos en la propuesta P3019R14 (Coe, Peacock y Parent): std::indirect y std::polymorphic. Ambos aportan semántica de valor a objetos asignados dinámicamente, algo que std::unique_ptr nunca resolvió del todo. Este artículo se centra en std::indirect.
El nuevo tipo existe porque unique_ptr presenta dos limitaciones cuando se usa como miembro de una clase de valor. Primero, rompe la propagación de const: operator*() const devuelve un T& no constante, de modo que un objeto marcado como const puede mutar sus miembros indirectos. Segundo, elimina las operaciones de copia, lo que obliga a reescribir manualmente los cinco métodos especiales (la conocida Rule of Five).
std::indirect resuelve ambos problemas. Posee un T en el heap y ofrece copia profunda, propagación correcta de const, comparación por valor y hash. operator->() const devuelve un puntero a const T, por lo que cualquier intento de mutación desde un método const se convierte en error de compilación. Además, no tiene estado nulo por diseño; tras un movimiento desde el objeto, valueless_after_move() devuelve true y acceder al contenido es comportamiento indefinido.
El tipo resulta especialmente útil en tres escenarios: el patrón PIMPL, donde indirect elimina el código repetitivo del unique_ptr; tipos recursivos como listas enlazadas, donde una estructura Node con std::indirect como siguiente enlace funciona sin más; y miembros de gran tamaño que conviene mover al heap para reducir sizeof sin perder semántica de valor. Un próximo artículo cubrirá std::polymorphic, que extiende la misma idea a jerarquías de clases.
