Почему при обьявлении константной переменной с помощью тернарного оператора не удаёться создать двумерный массив

Мне нужно создать двумерный массив размер которого определиться в ходе условия что-то вроде

void func(value)
{
    const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
    int m[size][4] = {};
}

Но возникает ошибка выражение должно иметь константное значение в чем проблема если size константа?


Ответы (2 шт):

Автор решения: ArtemiiSelyankin

size это константа, но 'value' которая участвует в вычислениях не является константой. Значение константной size станет известно только после вычислений которые вы задали. Размер статического массива должен быть известен на этапе компиляции. Я сейчас нашел несколько способов решения этой задачки:

1)

void func()
{
    const int value = 1;   //Вместо 1 можно поставить любое константное число
    const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
    int m[size][4] = {};
}

Но тогда в этих вычислениях не будет смысла. Даже если вы укажете const в параметре функции это все равно не поможет

void func(const int value)
{
    ...
}

так как мы все равно можем передать в функцию разные значения 'value' во время выполнения программы, а раз это так, то и размер массива будет известен только во время выполнения программы, а так как это статический массив его размер должен быть известен уже на этапе компиляции.

  1. Динамически выделить массив и не забыть освободить память.
void func(int value)
{
    const char size = (value == 1) ? 10 : (value == 2) ? 20 : 0;
    int** m = new int*[size];

    for (size_t i = 0; i < size; i++)
    {
        m[i] = new int[4];
    }

    //Освобождаем память
    for (size_t i = 0; i < size; i++)
    {
        delete[] m[i];
    }
    delete[] m;
    m = nullptr;
}
→ Ссылка
Автор решения: Mikhailo

При определении массива простого const в общем-то недостаточно: const - это просто обещание не менять полученное при инициализации значение. А нужен constexpr - т.е. это значение известно при компиляции, а не в момент инициализации.

→ Ссылка