2012-03-07 4 views
11

내가 정수 배열 그러나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; 
} 

에 스택에 고정 된 크기를 할당하는 것을 시도하고있다, 이것은 내가 고정
error C2057: expected constant expression을 정의 할 수 N를 사용하고 마지막 줄에 오류가 있습니다.

그러나 Nconst int N = 10으로 정의하면 코드가 올바르게 컴파일됩니다. n1을 타이 캐스팅하여 const int으로 처리하려면 어떻게해야합니까?

시도 :const int N = const_cast<const int>(n1)하지만 오류가 발생합니다.

편집 : 나는 이것을 컴파일하기 위해 MS VC++ 2008을 사용하고 있습니다 ... g ++로 잘 컴파일합니다.

답변

17

n1을 입력하면 const int으로 어떻게 처리해야합니까?

이 목적으로는 사용할 수 없습니다.

배열의 크기는 정수 상수 표현 (ICE)이어야합니다. 이 값은 컴파일 타임에 계산 가능해야합니다. const int (또는 다른 const 한정 정수형 객체)은 Integral Constant Expression으로 초기화 될 수있는 경우에만 Integral Constant Expression에서 사용할 수 있습니다.

비 const 개체 (예 : n1)는 Integral Constant Expression의 아무 곳에 나 나타날 수 없습니다.

std::vector<int>을 사용해 보셨나요?

[주 - 캐스트는 완전히 필요하지 않습니다. 다음 모두 모두 정확히 동일합니다

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

--end 참고]

+2

그냥 한 자세한 내용을 추가 할 : GCC는 확장으로 컴파일 - 사실, 그것은 심지어 아닌 다른 표현을 할 수 있습니다 'int x (int a) {int b [a];와 유사하다. }' –

+0

아, 감사합니다, @ JerryCoffin. 나는 게시했을 때 편집을 보지 못했습니다. –

3

만 고정 된 크기의 배열이 그런 식으로 할당 할 수 있습니다. 메모리를 동적으로 (int* foo = new int[N];) 할당하고 완료되면 삭제하거나 (바람직하게) std::vector<int>을 사용하십시오.

(편집 : GCC accepts that as an extension하지만은 C++ 표준의 일부가 아니다.)

관련 문제