Поскольку компьютеры конечны, реализации 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].