Cppreference говорит, что список атрибутов внутри двойных скобок [[]] может быть идентификаторами.
Скажем, у меня есть переменная с именем noreturn в моей программе на C++ (так что это идентификатор переменной). Это мешает интерпретации атрибута [[noreturn]]? Я думаю, что если идентификаторы в список атрибутов используют то же пространство имен, что и обычные идентификаторы (в этом примере они оба остаются в глобальном пространстве имен), компилятор может интерпретировать его как идентификатор переменной, тогда он не распознает его. как допустимый атрибут C++.
Пример:
int noreturn = 1;
[[ noreturn ]] void f() {
throw "error";
}
Использование [[noreturn]] описано здесь: https://en.cppreference.com/w/cpp/language/attributes/noreturn
Обновлять: для пояснения, я знал, что в C (не C++) есть 4 «предопределенных» пространства имен: для меток, для тегов, для членов структуры / объединения и для обычных идентификаторов. Но он определен для C (C11 6.2.3), поэтому я подумал, есть ли в C++ 11 добавленное к ним пространство имен «атрибут». Согласно принятому ответу, в C++ правила выражены по-другому, но аналогия сохраняется.
@ n.m. Я думаю, вы немного упустили мою точку зрения .. пожалуйста, посмотрите обновление. Но все равно спасибо.





Атрибуты принадлежат другому пространству имен (не связан с namespace). Для атрибутов есть место для именования.
То же самое и с этикетками:
int l=2;
l: if (l<5) { l++; goto l; };
также действителен (даже если это может сбивать с толку).
the compiler might interprets it as an identifier to a variable,
Нет, не будет!
Итак, в вашем примере компилятор не испортит атрибут noreturn с переменной noreturn, как в моем примере выше, он не испортит метку l с переменной l.
См. Стандарт C++ 11 n3337 §7.6.1 [dcl.attr.grammar], в котором дополнительно объясняется:
No name lookup (3.4) is performed on any of the identifiers contained in an attribute-token.
Конечно, для удобства чтения я бы рекомендовал не использовать имена атрибутов в качестве идентификаторов переменных (но это подсказка, а не требование).
Кстати, вы не хотите смешивать символы препроцессора #define-d с атрибутами.
Большое спасибо! Я знал, что существует 4 «предопределенных» пространства имен: для меток, для тегов, для членов структуры / объединения и для обычных идентификаторов. Но он определен для C (C11 6.2.3), поэтому я подумал, есть ли в C++ 11 добавленное к ним пространство имен «атрибут». Судя по вашему ответу, похоже, так оно и есть.
В C++ другое правило (поскольку теги type и struct находятся в одном пространстве), но аналогия остается в силе.
> «Поиск имени (3.4) не выполняется ни для одного из идентификаторов, содержащихся в токене атрибута». Но есть одно исключение. Это спецификатор "alignas", который также иногда рассматривается как атрибут. Для аргумента «alignas» вы можете предоставить любое постоянное выражение, включая те, которые вы определили как const.
Ничто в стандарте не связывает идентификаторы атрибутов с именами, определенными в программе. В этом суть атрибутов. Идентификаторы, которые мешают другим именам, называются зарезервированные слова. Имена атрибутов не являются зарезервированными словами.