Annex B (informative) Implementation quantities [implimits]

Поскольку компьютеры конечны, реализации C ++ неизбежно ограничены в размере программ, которые они могут успешно обрабатывать. Каждая реализация должна документировать эти ограничения, если они известны. В этой документации могут указываться фиксированные ограничения там, где они существуют, например, как вычислять пределы переменных в зависимости от доступных ресурсов, или указываться, что фиксированные ограничения не существуют или неизвестны.

Пределы могут ограничивать количества, которые включают описанные ниже или другие. Число в скобках после каждого количества рекомендуется как минимум для этого количества. Однако эти количества являются лишь ориентировочными и не определяют соответствие.

  • Уровни вложенности составных операторов, структур управления итерацией и структур управления выбором [256].

  • Уровни вложенности условного включения [256].

  • Указатели, массивы и деклараторы функций (в любой комбинации), изменяющие класс, арифметику или неполный тип в объявлении [256].

  • Уровни вложенности выражений в скобках в полное выражение [256].

  • Количество символов во внутреннем идентификаторе или имени макроса [1 024].

  • Количество символов во внешнем идентификаторе [1 024].

  • Внешние идентификаторы в одной единице перевода [65 536].

  • Идентификаторы с областью действия блока объявлены в одном блоке [1 024].

  • Структурированные привязки вводятся в одном объявлении [256].

  • Макроидентификаторы одновременно определены в одной единице трансляции [65 536].

  • Параметры в одном определении функции [256].

  • Аргументы в одном вызове функции [256].

  • Параметры в одном макроопределении [256].

  • Аргументы в одном вызове макроса [256].

  • Символы в одной логической исходной строке [65 536].

  • Символы в строковом литерале (после объединения) [65 536].

  • Размер объекта [262 144].

  • Уровни вложенности #include файлов [256].

  • Метки регистра для switch оператора (за исключением вложенных switch операторов) [16 384].

  • Члены данных в одном классе [16 384].

  • Лямбда-захваты за один lambda-expression[256].

  • Константы перечисления в одном перечислении [4 096].

  • Уровни вложенных определений классов в одном member-specification [256].

  • Функции, зарегистрированные в atexit() [32].

  • Функции, зарегистрированные в at_­quick_­exit() [32].

  • Прямые и косвенные базовые классы [16 384].

  • Прямые базовые классы для одного класса [1 024].

  • Члены объявлены в единственном классе [4 096].

  • Окончательное переопределение виртуальных функций в классе, доступно или нет [16 384].

  • Прямые и косвенные виртуальные базы класса [1 024].

  • Статические члены класса [1 024].

  • Объявления друзей в классе [4 096].

  • Объявления контроля доступа в классе [4 096].

  • Инициализаторы элементов в определении конструктора [6 144].

  • initializer-clauses в одном braced-init-list[16 384].

  • Объем квалификации одного идентификатора [256].

  • Вложенные внешние спецификации [1 024].

  • Рекурсивные вызовы функции constexpr [512].

  • Полные выражения, вычисляемые внутри основного константного выражения [1 048 576].

  • Аргументы шаблона в объявлении шаблона [1 024].

  • Рекурсивно вложенные экземпляры шаблона, включая подстановку во время вывода аргументов шаблона ([temp.deduct]) [1 024].

  • Обработчиков на блок попытки [256].

  • Количество заполнителей ([func.bind.place]) [10].