Подтвердить что ты не робот

Предоставляет ли С++ 11 значки доллара в идентификаторах?

Знаки доллара, разрешенные в идентификаторах в С++ 03?, показывают, что знаки доллара в идентификаторах не разрешены в С++ 03. GCC предоставляет его как расширение C и правильно дает диагностику в режиме С++ 03. Однако в С++ 11 int $ = 0 будет компилироваться без предупреждения.

Этот ответ объясняет, что $ может быть разрешен, потому что для реализации определенных идентификаторов не требуется диагностика:

Ответ здесь "Возможно" . Согласно §2.11, идентификаторы может состоять из цифр и идентификаторов-недигитов, начиная с одного последней. идентификаторы-недигиты являются обычными a-z, a-z и подчеркивание, кроме того, поскольку С++ 11 включают универсальные имена символов (например, \uBEAF, \UC0FFEE32), и другие символы, определенные реализацией. Таким образом, это реализация определена если использование $ в идентификаторе разрешено. VC10 и выше поддерживают это, возможно, более ранние версии. Он поддерживает даже такие идентификаторы, как こんばんわ.

Но: Я бы не использовал их. Сделайте идентификаторы максимально читабельными и переносимыми. $ - это реализация, и, следовательно, не переносимым.

Этот язык присутствует и в стандарте С++ 03, поэтому я не считаю это очень убедительным аргументом.

§2.10/2

Кроме того, некоторые идентификаторы зарезервированы для использования С++ реализаций и стандартных библиотек (17.6.4.3.2) и не должны быть используется иначе; диагностика не требуется.

Какое изменение в стандарте позволяет использовать $ в качестве имени идентификатора?

4b9b3361

Ответ 1

Это поведение, определяемое реализацией, $ не включено в грамматику для идентификаторов. Правилами имен идентификаторов в С++ 11 являются:

  • Он не может начинаться с числа
  • Может состоять из букв, цифр, подчеркивания, универсальных имен символов и определенных символов реализации
  • Не может быть keyword

Разрешены определенные пользователем символы, и многие компиляторы поддерживают как расширение, включая gcc, clang, Visual Studio и как отмечено в comment, по-видимому, DEC С++ компиляторы.

Грамматика описана в черновик стандарта С++ 2.11 Отступы, я добавил дополнительные примечания, начиная с <-:

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

Если мы скомпилируем этот код с помощью clang с флагом -pedantic-errors, он не скомпилируется:

int $ = 0

и генерирует следующую ошибку:

error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
    ^

Ответ 2

Я так не думаю. Знак доллара находится в ASCII 0x24, который не находится ни в одном из диапазонов, определенных в приложении E.1 (charname.allowed) стандарта. И поскольку он не является ни цифрой, ни недигитированной, он должен быть характерным для реализации символом. Таким образом, я уверен, что это не портативный С++ 11. Также обратите внимание, что идентификатор не должен начинаться с универсального символа, в то время как он позволяет идентификатору начинать с символа, допускаемого реализацией.