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