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

Можете ли вы начать имя класса с цифровой цифрой?

В С++ можно ли начинать имя класса с цифры? Например,

template <class T> class 2DArray {

public:
    // 1D ARRAY CLASS
    class 1DArray {
    public:
        1DArray() { Create(); }
        1DArray(iterator arr) : array1d_(arr) { }
        explicit 1DArray(size_type cols, const T& t = T()) { Create(cols, t); }
        1DArray(const 1DArray& arr) { Create(arr.begin(), arr.end()); }
        1DArray& operator=(const 2DArray&);
        ~1DArray() { Uncreate(); }

        T& operator[](size_type n) {
            return array1d_[n];
        }
        const T& operator[](size_type n) const {
            return array1d_[n];
        }
}
4b9b3361

Ответ 1

Правила для имен идентификаторов в С++:

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

Разделы в уровне проекта С++, которые охватывают это: 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
[...]

и 2.12 Ключевые слова объясняют весь идентификатор, зарезервированный для использования в качестве ключевых слов.

Наконец, также сохраняются следующие имена:

  • Имена, которые содержат двойной знак подчеркивания __, или начинаются с символа подчеркивания, за которым следует буква в верхнем регистре (например, _Apple) в любой области,
  • Имена, начинающиеся с символа подчеркивания в глобальном пространстве имен (например, _Apple в глобальном пространстве имен), зарезервированы.

Раздел, который охватывает это в черновом проекте, 17.6.4.3.2. Мы можем найти обоснование того, почему они зарезервированы из Обоснование для международных языков стандартного программирования-C, в котором говорится:

[...] Это дает пространство имен для написания многочисленных за кадром внеземных макросов и функций, которые библиотека должна выполнять свою работу должным образом [...]

В С++ это также относится к name mangling как это example показывает.


Сноска

  • 1. Разрешенные универсальные символы

Универсальные символы, которые разрешены, покрываются в Annex E.1:

E.1 Диапазоны разрешенных символов [charname.allowed]

00A8, 00AA, 00AD,

00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF

0100-167F, 1681-180D, 180F-1FFF 200B-200D, 202A-202E, 203F-2040, 2054,

2060-206F 2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF

3004-3007, 3021-302F, 3031-303F

3040-D7FF F900-FD3D, FD40-FDCF,

FDF0-FE44, FE47-FFFD

10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

Ответ 2

Поскольку, как ни удивительно, я не смог найти дубликат или более общую версию этого вопроса, вот ответ, основанный на том, что говорит Standard (С++ 11).

Прежде всего, в соответствии с § 9/1, имя класса является идентификатором (или идентификатором simple-template-id в случае специализации шаблона, но идентификатор simple-template также состоит из идентификаторов).

В §2.11 определяется, что такое действительный идентификатор. Вначале он вводит несколько базовых понятий:

Один из этих цифр: 0 1 2 3 4 5 6 7 8 9
Одной из них является недигит: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Имя универсального символа - это последовательность типа \unnnn или \Unnnnnnnn (где каждый n является шестнадцатеричной цифрой)

Затем в стандарте определяется идентификатор-недигит как

  • либо недигит
  • или имя универсального символа
  • или специальный символ (& ddagger;)

Наконец, идентификатор определяется рекурсивно как

Идентификатор:
  идентификатор-нецифровой
  &nbsp идентификатор; идентификатор-нецифровой
  &nbsp идентификатор; цифра

Резюме. Другими словами, идентификатор должен начинаться с алфавитного символа (без цифр!), за которым могут следовать все, что составлено из буквенно-цифровых символов, символов подчеркивания и \unnnn -подобных символов. Все остальное связано с реализацией.


(& ddagger;) Независимо от того, поддерживаются ли какие-либо файлы, зависит от вашего компилятора, и их использование обычно означает, что вы теряете переносимость для других компиляторов или версий компилятора.

Ответ 3

Простой ответ - нет. Например, почему бы не назвать его OneDArray?

Ответ 4

Имена в С++ должны начинаться с буквы "letter", где буква - это все верхний и нижний регистр "A-Z, a-z". "_" также считается "буквой". Затем может следовать любая комбинация букв и цифр.