Константные выражения
В нескольких местах C++ требует выражения, вычисление которых дает константу: в качестве границы массива (), в case выражениях (), в качестве значений параметров функции, присваиваемых по умолчанию, (), и в инициализаторах (). В первом случае выражение может включать только целые константы, символьные константы, константы, описанные как имена, и sizeof выражения, возможно, связанные бинарными операциями
+ - * / % == != =
или унарными операциями
- ~ !
или тернарными операциями
? :
Скобки могут использоваться для группирования, но не для вызова функций.
Большая широта допустима для остальных трех случаев использования; помимо константных выражений, обсуждавшихся выше, допускаются константы с плавающей точкой, и можно также применять унарную операцию к внешним или статическим объектам, или к внешним или статическим массивам, индексированным константным выражением. Унарная операция может также быть применена неявно с помощью употребления неиндексированных массивов и функций. Основное правило состоит в том, что инициализаторы должны при вычислении давать константу или адрес ранее описанного внешнего или статического объекта плюс или минус константа.
Меньшая широта допустима для константных выражений после #if: константы, описанные как имена, sizeof выражения и перечислимые константы недопустимы.