Постоянная инициализация в динамическом режиме

Я думаю, что переменная, объявленная как const применяется только Static Initialization, Я написал следующее:

#include <cstdlib>
#include <iostream>

struct A{ };

const A *i = new A();

int main(){ }

и работает нормально.

Ideone

Но я ожидал, что код неверен, потому что new A() это new-expression и это не constant expression, На самом деле:
сек. 5.19 / 2 N3797:

Условное выражение e является основным константным выражением, если только
оценка e, следуя правилам абстрактной машины (1.9),
оценил бы одно из следующих выражений:
[…] — новое выражение (5.3.4);

[…]

а также

Константное выражение является либо основным выражением glvalue
значение которого относится к объекту со статической продолжительностью хранения или к
функция,

1

Решение

Во-первых, вы, вероятно, имели в виду A * const i (постоянный указатель на A) и не const A * i (непостоянный указатель на const A).

Тем не менее, даже с этой модификацией, вполне законно инициализировать const переменная со значением, которое не является константным выражением (например, значение, вычисленное во время выполнения). Однако тогда невозможно использовать такую ​​переменную внутри константных выражений. Если вы попробуете это, определение константного выражения сработает, и вы получите ошибку.

4

Другие решения

Инициализация const переменная не требует постоянного выражения.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector