Я могу определить длину массива с помощью константы, так почему же не работает int d [b]?

11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

Определение f[c]является действительным.
Переменная bтакже является константой int, но компилятор выдал ошибку «выражение должно иметь постоянное значение» для строки int d[b]. Каковы различия между bи c?

OliverShang
источник

Ответы:

16

Каковы различия между B и C?

c имеет инициализатор постоянной времени компиляции, а b - нет. Константный объект с инициализатором постоянной времени компиляции сам по себе является значением постоянной времени компиляции.

Так как я могу определить длину arry, используя константу, так почему бы это не сработать?

Не любая константа будет делать. constквалификатор подразумевает постоянство времени выполнения (т. е. значение может быть определено во время выполнения, но не будет изменяться в течение всего времени жизни объекта). В качестве размера массива могут использоваться только значения постоянной времени компиляции.

eerorika
источник
6

Вы используете непостоянную переменную для присвоения значения константе. Следовательно, значение этой переменной не может быть определено во время компиляции . Я знаю, что вы не меняетесь a, но компилятор так не думает.

CoderCharmander
источник
4

Диагностика компилятора действительно должна быть выражением, вычисляемым по времени компиляции .

Так как исходный объект , к которому bназначен не const, bэто не выражение постоянная времени анализа компиляции, поэтому компиляция произойдет сбоя , как массивы переменной длины не поддерживаются в стандартных C ++.

Вирсавия
источник
1

«Const» только означает, что переменная не будет изменяться во время выполнения, и не означает, что ее значение может быть определено во время компиляции.

Я думаю, что вы ищете "constexpr". Может быть, вы можете попробовать это так:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Вместо этого «constexpr» означает «реальное const», а «const» означает только «неизменяемый var» по какой-то исторической причине. Следует помнить, что нативный массив в c ++ всегда имеет фиксированную длину, как сказал @Bathsheba.

Леон
источник
О каких "других языках" ты говоришь?
Брайан
1
@ Брайан Извините, это не актуально. Я изменил свой ответ.
Леон
«Нет настоящего шотландца ...» - позвольте мне не согласиться с вашим «constexpr», вместо этого означает «реальное const», а «const» означает только «неизменяемый var» оператор. «const» означает «const», «constexpr» означает «constexpr» - они имеют два разных значения и значения в контексте языка c ++. «const» означает «объект не может быть изменен» , «constexpr» означает «можно оценить значение функции или переменной во время компиляции»
CharonX
Извините, может я неправильно это выразил. Английский не мой родной язык.
Леон
1

Термин «константа» действительно неоднозначен, а ключевое слово constвводит в заблуждение.

constозначает: «не разрешать значение этого объекта не будет изменено после инициализации». Это не означает «постоянная времени компиляции». Его начальное значение может (и обычно имеет) все еще прибыть из источников времени выполнения.

Вам нужна константа времени компиляции для границы массива.

Иногда возможно иметь объект с именем, fooкоторый является константой времени компиляции, если он есть, const и он был инициализирован из константного выражения, такого как литерал или constexprвещь. Это дело для c; это не так b.

Гонки легкости на орбите
источник