Вопрос по const, c++, arrays – Инициализация массива использует переменную const в C ++

4

это может работать:

const int size = 2;
int array[size] = {0}; 

это имеет ошибку компиляции:

int a = 2;
const int size = a;
int array[size] = {0};

Зачем?

const Безразлично»t означает постоянную времени компиляции. chris

Ваш Ответ

4   ответа
4
const int size = 2;
int array[size] = {0}; 

Вот,2 это буквальное значение, это означает, что вы можетеt изменить его, и компилятор узнает значение во время компиляции.

int a = 2;
const int size = a;
int array[size] = {0};

Тем не мение,a является переменной, что означает, что значениеa может быть изменен, и будет уверен во время выполнения, поэтому компилятор запрещает вам. Ты можешь использовать

int a = 2;
int size = a;
int* array = new int[size];

Таким образом, вы можете подать заявку на массив с динамическим размером.

7

Техническая причина заключается в том, что первое выражение, которое используется для инициализацииsize является константным выражением и может быть вычислено во время компиляции. Это означает, что компилятор может также знать, насколько большим будет массив и его распределение (в данном случае "оговорка» может быть более подходящим термином) может быть сделано во время компиляции.

Во втором случае вместо этого выражение не является константным выражением (с учетом определения C ++), и это восстановление невозможно.

Тот факт, что во втором случае значение действительно фиксируется ко времениsize инициализируется совершенно не имеет значения. Правила основаны натакое выражение и второе выражение использует изменяемые переменные, и поэтому компилятор считает его непостоянным.

Разрешение второй формы для инициализации во время компиляции потребовало бы анализа потока, потому что это должно было бы различить

int a = 2;
const int size = a;

а также

int a = foo();
const int size = a;

где выражение с участиемsize действительно идентичен.

Так что'нет способа инициализировать массив с известным размером, если этот размер нет инициализирован так? Zap
2

Когда ОС пытается запустить вашу программу из-за природы C ++, ОС захочет узнать точное место длястек площадь. В первом примере ОС узнает, что значение переменной не изменится. Но для второго примера при взгляде на ОС ваша первая переменная, которая является "a" можно изменить между

int a = 2;

это и это

const int size = a;

Ваша переменная может быть изменяемой. Тот'почему твой компилятор нене позволяет вам скомпилировать свой код.

Чтобы узнать больше об основах управления памятью. Я рекомендую вамhttps://stackoverflow.com/a/24922/2326288 этот комментарий

0

size инициализируется компилятором во время компиляции. Во втором случаеa может быть инициализирован ввремя выполнения так чтоsize также будет инициализироваться во время выполнения и больше не будет константой времени компиляции.

Похожие вопросы