У меня есть эти две предполагаемые константы:
int const MATRIX_SIZE = 1000;
int const LONGEST_LR_LINK = (int)floor(MATRIX_SIZE/2);
Я пытаюсь объявить массив:
int lrLinkArray [LONGEST_LR_LINK];
Я получаю ошибку:
ошибка: граница массива не является целочисленной константой перед токеном ‘]
Не было бы так много проблем, чтобы вручную подключить половину MATRIX_SIZE для LONGEST_LR_LINK, но мне любопытно, каким будет решение этой проблемы. Это плохая практика делать какие-либо вычисления для const?
Целочисленное деление в C ++ автоматически округляется. Так что если у вас есть определение
int const LONGEST_LR_LINK = MATRIX_SIZE/2;
затем LONGEST_LR_LINK
действительно будет постоянным выражением, и
int lrLinkArray [LONGEST_LR_LINK];
все должно быть в порядке. Кроме того, floor(MATRIX_SIZE/2)
во всяком случае, не делает то, что думаешь; вам придется написать floor(MATRIX_SIZE/2.0)
для того, чтобы форсировать нецелое деление.
int const LONGEST_LR_LINK = MATRIX_SIZE/2;
Целочисленное деление уже округляется.
Целочисленное деление должно делать то, что вы хотите, мы можем увидеть это из проект стандарта C ++, в разделе 5.6
Мультипликативные операторы это говорит:
[…] Для целочисленных операндов оператор / дает алгебраический фактор
с любой дробной частью отбрасывается;81[…]
Чтобы понять, почему это не так, вы должны понимать, что даже если вы инициализируете MATRIX_SIZE
с литералом, который делает его постоянным выражением станд :: этаж это не функция constexpr и поэтому LONGEST_LR_LINK
также не является константным выражением и не может использоваться для границ массива, которые требуют интегрального константного выражения.
Кроме того, насколько я понимаю, преобразования в старом стиле C также не допускаются в константных выражениях.