Как преобразовать int в const int для назначения размера массива в стеке?

Я пытаюсь выделить фиксированный размер в стеке для целочисленного массива

#include<iostream>
using namespace std;

int main(){

    int n1 = 10;
    const int N = const_cast<const int&>(n1);
    //const int N = 10;
    cout<<" N="<<N<<endl;
    int foo[N];
    return 0;
}

Однако это дает ошибку в последней строке, где я использую N для определения фиксированного error C2057: expected constant expression.

Однако, если я определяю N как const int N = 10, код компилируется просто отлично. Как мне следует прибегнуть к n1, чтобы передать его как const int?

Я пробовал: const int N = const_cast<const int>(n1), но это дает ошибку.

EDIT: Я использую MS VС++ 2008 для компиляции этого... с g++ он компилируется отлично.

Ответ 1

Как мне выбрать n1 для обработки его как const int?

Вы не можете, не для этой цели.

Размер массива должен быть тем, что называется интегральным константным выражением (ICE). Значение должно быть вычислимым во время компиляции. A const int (или другой объект с целым целым const-типом) может использоваться в интегральном выражении константы, только если он сам инициализируется интегральным константным выражением.

Неконстантный объект (например, n1) не может появляться нигде в интегральном константном выражении.

Считаете ли вы использование std::vector<int>?

[Примечание. Бросок полностью не нужен. Оба из них одинаковы:

const int N = n1;
const int N = const_cast<const int&>(n1);

- Заключительная записка]

Ответ 2

Можно назначить только массивы фиксированного размера. Либо распределите память динамически (int* foo = new int[N];) и удалите ее, когда вы закончите, либо (предпочтительно) используйте std::vector<int> вместо этого.

(Edit: GCC принимает это как расширение, но не является частью стандарта С++.)