Атрибуты (то есть атрибуты как особенность языка C ++, а не атрибуты c __declspec
или __attribute__
, специфичные для компилятора) являются своего рода взломом C ++. Это решение мета-проблем, связанных с эволюцией языка C ++.
Например, ключевые слова. Существует много кода C ++, и любая новая версия языка, которая добавляет новые ключевые слова, должна избегать взлома любого кода, который может использовать это ключевое слово в качестве идентификатора. Таким образом, любая языковая функция, которая может захотеть что-то изложить явно, имеет действительно высокую планку для прохождения стандартизации. То есть, лучше бы оно того стоило.
Но атрибуты дешевы; они не конфликтуют с существующим кодом. Подумайте о том, чтобы объявить, что функция не возвращает нормально (ie: всегда выдает исключение или вызывает std::terminate
или что-то еще). Эта функция на самом деле не управляет поведением программы; это скорее индикатор для компилятора / пользователя о том, как эта функция будет себя вести. Так что не стоит нарушать код того, кто случайно назвал переменную noreturn
.
Но у вас может быть атрибут [[noreturn]]
, так как это не нарушит чей-либо код.
Другое решение атрибутов мета-проблемы - это «исправление» вещей, которые, возможно, изначально не были хорошими идеями. Например, метки case
в операторах switch
автоматически переходят к следующему, если вы явно не указали break
. Хотя проваленное поведение полезно, это неправильное поведение как по умолчанию , поскольку в 90 +% случаев вы намереваетесь break
.
Но вы не можете go и измените способ работы case
меток и введите ключевое слово fallthrough
. Это сломало бы любой код, который уже использует неявное поведение падения.
Но вы можете добавить атрибут [[fallthrough]]
. Это ничего не значит в языке, но если компилятор это видит, он может знать, что вы хотели перейти к следующей метке. Кроме того, теперь вы можете включить предупреждения компилятора о провале, чтобы любой провал, который происходит без атрибута [[fallthrough]]
, выдавал вам предупреждение. И вы даже можете сделать это предупреждение ошибкой, эффективно «исправляя» язык. Для вас.
Большинство атрибутов C ++ похожи на это: теги для кода, которые слишком тривиальны / нефункциональны, чтобы беспокоиться о записи ключевого слова, или указывают компилятору что-то полезное в коде, которое на самом деле не является частью языка.