El idiom PImpl (Pointer to Implementation) es una técnica de programación en C++ que consiste en ocultar los detalles de implementación de una clase tras un puntero opaco a una clase interna definida en el archivo .cpp. Su objetivo es separar interfaz e implementación y reducir las dependencias en tiempo de compilación, de modo que los cambios en la implementación no obliguen a recompilar a los clientes. Tradicionalmente se implementa con un puntero crudo junto a la Rule of Five —destructor, constructor de copia, asignación por copia, constructor de movimiento y asignación por movimiento—, lo que obliga a escribir código repetitivo para gestionar recursos y deja dos problemas conocidos: la constancia no se propaga del objeto público al objeto apuntado y un objeto movido puede contener un puntero nulo, situación de comportamiento indefinido. La llegada de std::unique_ptr simplificó la versión anterior al automatizar la liberación de memoria, aunque fue necesario declarar destructor y constructores de movimiento en el .cpp para que el deleter pudiera ver el tipo completo. C++26 introduce std::indirect, un nuevo tipo de vocabulario declarado en que actúa como un envoltorio opaco para objetos asignados dinámicamente con semánticas de valor: se puede copiar y asignar por copia sin código adicional y propaga la const correctamente. Con std::indirect, la clase Widget puede declararse con las cinco funciones miembro especiales simplemente como = default, incluido el destructor, y la inicialización se realiza con std::in_place. Esto elimina la necesidad de definir manualmente la gestión de recursos y resuelve tanto el problema de la constancia como el del estado post-movimiento, convirtiendo a std::indirect en el sustituto natural de std::unique_ptr en patrones PImpl.
