HeadlinesBriefing HeadlinesBriefing.com

Contratos C++26: precondiciones y postcondiciones

Hacker News •
×

En el artículo sobre el endurecimiento de la biblioteca estándar, vimos que muchos requisitos de la biblioteca se expresan como "contratos". Esta publicación explora los contratos en C++26 y cómo pueden aplicarse a nuestro propio código.

La explicación comienza con un ejemplo sencillo: una función que devuelve un valor de un std::vector en un índice dado. Tradicionalmente, el requisito de que el índice sea válido se impone con assert dentro del cuerpo de la función. Este enfoque tiene inconvenientes. El requisito vive en la implementación, por lo que quien lea solo la declaración ve un vector y un índice sin la relación entre ambos. Además, las aserciones solo se controlan mediante NDEBUG, que elimina la comprobación por completo cuando se define.

Los contratos de C++26, introducidos mediante P2900, trasladan el requisito a la firma de la función con una cláusula pre(...) colocada después de la lista de parámetros. Esta precondición establece una condición que se espera que se cumpla al entrar en la función. El mismo requisito también puede aparecer en la declaración, haciéndolo visible para cualquiera que lea la API. Los contratos ofrecen varias semánticas de evaluación, como ignorar una comprobación, informar de una violación y continuar, o terminar el programa, determinando la implementación del compilador cuáles están disponibles y cómo se seleccionan.

Los contratos también distinguen entre lo que el llamador debe proporcionar y lo que la función promete devolver. Las postcondiciones, introducidas con post, expresan esas promesas sin requerir comprobaciones manuales antes de cada sentencia return. Esto hace que los contratos sean útiles para documentar APIs incluso cuando la comprobación en tiempo de ejecución está desactivada.

El artículo concluye con un ejemplo completo de precondición y abarca temas adicionales como las postcondiciones, la ubicación de los contratos en declaraciones y definiciones, las opciones del compilador y detalles que pueden sorprender a los desarrolladores.

Fuente: Hacker News · Resumido por HeadlinesBriefing