Especificando quando e onde uma anotação se aplica

Quando uma anotação é condicional, pode exigir outras anotações para especificar isso ao analisador. Por exemplo, se uma função tiver uma variável que possa ser síncrona ou assíncrona, a função se comportará da seguinte maneira: no caso síncrono, ela sempre terá êxito, mas, no caso assíncrono, ela relatará um erro se não conseguir ter êxito imediatamente. Quando a função é chamada de forma síncrona, a verificação do valor do resultado não fornece nenhum valor para o analisador de código porque ela não teria retornado. No entanto, quando a função é chamada de forma assíncrona e o resultado da função não é verificado, pode ocorrer um erro grave. Este exemplo ilustra uma situação na qual você pode usar a anotação _When_, descrita posteriormente neste artigo, para habilitar a verificação.

Anotações estruturais

Para controlar quando e onde as anotações se aplicam, use as anotações estruturais a seguir.

Anotação Descrição
_At_(expr, anno-list) expr é uma expressão que gera um lvalue. As anotações em anno-list são aplicadas ao objeto nomeado por expr. Para cada anotação em anno-list, expr será interpretado em pré-condição se a anotação for interpretada em pré-condição, e na pós-condição se a anotação for interpretada na pós-condição.
_At_buffer_(expr, iter, elem-count, anno-list) expr é uma expressão que gera um lvalue. As anotações em anno-list são aplicadas ao objeto nomeado por expr. Para cada anotação em anno-list, expr será interpretado em pré-condição se a anotação for interpretada em pré-condição, e na pós-condição se a anotação for interpretada na pós-condição.

iter é o nome de uma variável que tem escopo para a anotação (inclusive de anno-list). iter tem um tipo implícito long. Variáveis nomeadas de forma idêntica em qualquer escopo de cerca são ocultas da avaliação.

elem-count é uma expressão C++ válida que é avaliada como um inteiro.
_Group_(anno-list) Todas as anotações são consideradas anno-list como qualificadoras que se aplicam à anotação de grupo aplicada a cada anotação.
_When_(expr, anno-list) expr é uma expressão que pode ser convertida para bool. Quando não é zero (true), as anotações especificadas em anno-list são consideradas aplicáveis.

Por padrão, para cada anotação em anno-list, expr será interpretado como usando os valores de entrada se a anotação for uma pré-condição, e como usando os valores de saída se a anotação for uma pós-condição. Para substituir o padrão, você pode usar o _Old_ intrínseco ao avaliar uma pós-condição para indicar que os valores de entrada devem ser usados. Observação: anotações diferentes podem ser habilitadas como uma consequência de usar _When_ se um valor mutável, por exemplo, *pLength estiver envolvido porque o resultado avaliado de expr na pré-condição pode diferir de seu resultado avaliado na pós-condição.

Confira também