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.