Создание массива с параметром размера const int в функции вызывает ошибку в Visual Studio C ++: выражение не было константой - PullRequest
3 голосов
/ 11 февраля 2020
void foo(const int size) {
    char array[size];
}
int main() { }

Приведенный выше код вызывает ошибку компилятора в Visual Studio C ++:

error C2131: expression did not evaluate to a constant
note: failure was caused by a read of a variable outside its lifetime

Почему size не оценивается как константа, даже если она объявлена ​​как const int?
Но следующий код успешно компилируется:

int main() {
    const int size{ 10 };
    char array[size];
}

Ответы [ 4 ]

3 голосов
/ 11 февраля 2020

Это компилируется, потому что размер действительно постоянен.

int main() {
    const int size{ 10 };
    char array[size];
}

Это, однако, не скомпилируется, потому что размер является постоянной переменной, а не постоянной времени компиляции (есть небольшая разница)

void foo(const int size) {
    char array[size];
}

причина, по которой это не сработает, в том, что я могу вызвать foo с разными аргументами.

foo(10);
foo(42);
foo(1);

Самый простой способ - использовать std :: vector, что вы и пытаетесь сделать ...

void foo(const int size) {
    std::vector<char> array(size);
}

и теперь массив будет работать с то же самое намерение, что и ваш исходный код.

2 голосов
/ 11 февраля 2020

C ++ является статически типизированным языком, а char array[1] и char array[2] являются разными типами, поэтому эти типы должны быть известны во время компиляции.

Например,

void foo(const int size) {
    char array[size];
}
int main() {
    int x = std::rand() % 1000;
    foo( x ); // Error
}

В этом случае компилятор не может знать тип char array[size] во время компиляции, потому что размер определяется во время выполнения, поэтому это ошибка.

Так как @Frodyne указал в комментариях, размер массивов stati c должно быть константное выражение

2 голосов
/ 11 февраля 2020

Размер массива должен быть постоянной времени компиляции , а не просто временем выполнения const.

0 голосов
/ 11 февраля 2020

Поскольку постоянный размер переменной инициализируется как «10», значение размера не может быть изменено. Размер массива фиксирован и не может быть изменен.

int size = 10; // значение размера может быть изменено.

...