HeadlinesBriefing HeadlinesBriefing.com

Contratos C++26: pré e pós-condições

Hacker News •
×

No artigo sobre o endurecimento da biblioteca padrão, vimos que muitos requisitos da biblioteca são expressos como "contratos". Este post explora os contratos no C++26 e como eles podem ser aplicados ao nosso próprio código.

A discussão começa com um exemplo simples: uma função que retorna um valor de um std::vector em um determinado índice. Tradicionalmente, o requisito de que o índice seja válido é imposto com assert dentro do corpo da função. Essa abordagem tem desvantagens. O requisito fica na implementação, de modo que quem lê apenas a declaração vê um vector e um índice sem a relação entre eles. As asserções também são controladas apenas por NDEBUG, que remove a verificação por completo quando definido.

Os contratos do C++26, introduzidos pela P2900, movem o requisito para a assinatura da função com uma cláusula pre(...) posicionada após a lista de parâmetros. Essa pré-condição declara uma condição que deve valer na entrada da função. O mesmo requisito também pode aparecer na declaração, tornando-o visível para qualquer pessoa que leia a API. Os contratos oferecem várias semânticas de avaliação, incluindo ignorar uma verificação, reportar uma violação e continuar, ou encerrar o programa, sendo que a implementação do compilador determina quais estão disponíveis e como são selecionadas.

Os contratos também distinguem entre o que o chamador deve fornecer e o que a função promete retornar. As pós-condições, introduzidas com post, expressam essas promessas sem exigir verificações manuais antes de cada instrução return. Isso torna os contratos úteis para documentar APIs mesmo quando a verificação em tempo de execução está desativada.

O artigo termina com um exemplo completo de pré-condição e aborda outros tópicos, como pós-condições, a colocação de contratos em declarações e definições, opções do compilador e detalhes que podem surpreender os desenvolvedores.

Fonte: Hacker News · Resumido por HeadlinesBriefing