Как преобразовать int в const int, чтобы назначить размер массива в стеке? - PullRequest
11 голосов
/ 07 марта 2012

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

#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), но это дает ошибку.

РЕДАКТИРОВАТЬ: Я использую MS VC ++ 2008 для компиляции этого ... с g ++ он компилируется нормально.

Ответы [ 2 ]

18 голосов
/ 07 марта 2012

Как мне следует ввести n1, чтобы он воспринимался как const int?

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

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

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

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

[Примечание -Актерский состав совершенно не нужен.Оба следующих элемента одинаковы:

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

- Конец примечания]

3 голосов
/ 07 марта 2012

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

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

...