Я думаю, что переменная, объявленная как const
применяется только Static Initialization
, Я написал следующее:
#include <cstdlib>
#include <iostream>
struct A{ };
const A *i = new A();
int main(){ }
и работает нормально.
Но я ожидал, что код неверен, потому что new A()
это new-expression
и это не constant expression
, На самом деле:
сек. 5.19 / 2 N3797:
Условное выражение e является основным константным выражением, если только
[…]
оценка e, следуя правилам абстрактной машины (1.9),
оценил бы одно из следующих выражений:
[…] — новое выражение (5.3.4);
а также
Константное выражение является либо основным выражением glvalue
значение которого относится к объекту со статической продолжительностью хранения или к
функция,
Во-первых, вы, вероятно, имели в виду A * const i
(постоянный указатель на A
) и не const A * i
(непостоянный указатель на const A
).
Тем не менее, даже с этой модификацией, вполне законно инициализировать const
переменная со значением, которое не является константным выражением (например, значение, вычисленное во время выполнения). Однако тогда невозможно использовать такую переменную внутри константных выражений. Если вы попробуете это, определение константного выражения сработает, и вы получите ошибку.
Инициализация const
переменная не требует постоянного выражения.