
As Sequências Especificadoras de Atributos (Attribute Specifiers) em C++ são metadados que fornecem informações adicionais ao compilador sobre como ele deve tratar certas partes do código.
Esses atributos podem ajudar a:
Vamos ver alguns exemplos de atributos em C++.
[[nodiscard]]:Esse atributo indica que o valor de retorno de uma função não deve ser ignorado. Se o valor de retorno for ignorado, o compilador gerará um aviso.
[[nodiscard]] int computeValue() {
    return 42;
}
int main() {
    computeValue(); // Aviso do compilador: o valor de retorno foi ignorado
    int result = computeValue(); // Correto, o valor de retorno é usado
    return 0;
}O compilador emitirá um aviso se a função computeValue for chamada e seu valor de retorno não for usado. Isso é útil para evitar a perda acidental de valores importantes.
Se você remover o
[[nodiscard]]do código note que não haverá avisos, mas com o[[nodiscard]]a saída será similar a isso:
nodiscard.cpp: In function ‘int main()’:
nodiscard.cpp:8:17: warning: ignoring return value of ‘int computeValue()’, declared with attribute ‘nodiscard’ [-Wunused-result]
    8 |     computeValue(); // Aviso do compilador: o valor de retorno foi ignorado
      |     ~~~~~~~~~~~~^~
nodiscard.cpp:3:19: note: declared here
    3 | [[nodiscard]] int computeValue() {[[fallthrough]]:Esse atributo é usado em uma declaração case dentro de um switch para indicar que a queda (fallthrough) para o próximo case é intencional. Isso ajuda a evitar avisos do compilador sobre quedas acidentais.
void process(int value) {
    switch (value) {
        case 1:
            // Código para o case 1
            [[fallthrough]];
        case 2:
            // Código para o case 2
            break;
        default:
            // Código para outros casos
            break;
    }
}No exemplo do switch, [[fallthrough]] indica que a queda de case 1 para case 2 é intencional. Sem esse atributo, o compilador poderia emitir um aviso sobre a falta de break em case 1.
[[unlikely]]:Esse atributo sugere ao compilador que a probabilidade de execução de um ramo de código é baixa. Isso pode ajudar na otimização do código gerado.
#include <iostream>
void checkValue(int value) {
    if (value == 42) [[unlikely]] {
        std::cout << "O valor é 42, o que é improvável!\n";
    } else {
        std::cout << "O valor não é 42.\n";
    }
}
int main() {
    checkValue(10);
    checkValue(42);
    return 0;
}O compilador pode otimizar o código gerado com base na dica de que a condição value == 42 é improvável de ser verdadeira, possivelmente reordenando o código para melhorar o desempenho no caso mais comum.
Esses atributos são parte da modernização contínua da linguagem C++ para tornar o código mais expressivo e ajudar na detecção precoce de erros, bem como na otimização de desempenho.
Para mais informações acesse o cpp reference.