[c++] 상수를 사용하여 배열의 길이를 정의 할 수 있는데 왜 int d [b]가 작동하지 않습니까?

int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

의 정의 f[c]가 유효합니다.
변수 b도 상수 int이지만 컴파일러는 “표현식에 상수 값이 있어야합니다” 라는 오류를 표시했습니다 int d[b]. 의 차이점은 무엇입니까 b와는 c?



답변

b와 c의 차이점은 무엇입니까?

c에는 컴파일 타임 상수 이니셜 라이저가 있지만 b에는 없습니다. 컴파일 타임 상수 이니셜 라이저가있는 const 객체는 그 자체가 컴파일 타임 상수 값입니다.

상수를 사용하여 arry의 길이를 정의 할 수 있기 때문에 왜 작동하지 않습니까?

어떤 상수도 할 수 없습니다. const한정자는 런타임 constness를 의미합니다 (즉, 값은 런타임에 결정될 수 있지만 객체의 수명 동안 변경되지는 않습니다). 컴파일 시간 상수 값만 배열 크기로 사용할 수 있습니다.


답변

상수가 아닌 변수를 사용하여 상수에 값을 할당하고 있습니다. 따라서 해당 변수의 값 은 컴파일 시간을 결정할 수 없습니다 . 나는 당신이 변하지 않는다는 것을 알고 a있지만 컴파일러는 이와 같이 생각하지 않습니다.


답변

컴파일러 진단은 실제로 컴파일 시간 평가 가능한 상수 표현식 이어야 합니다 .

이는 원래 목적 때문에 b할당이 아닌 const, b컴파일이 가변 길이 배열은 표준 C ++에서 지원되지 않기 때문에 실패 때문에, 컴파일 시간에 평가가 일정한 표현이 아니다.


답변

“const”는 단지 변수가 런타임에 변하지 않는다는 것을 의미하며 컴파일 할 때 그 값을 추론 할 수있는 것은 아닙니다.

당신이 찾고있는 것이 “constexpr”이라고 생각합니다. 아마도 다음과 같이 시도해 볼 수 있습니다.

constexpr int b = 4; // can't be assigned from a!
int d[b];

“constexpr”은 대신 “실제 const”를 의미하고 “const”는 일부 역사적 이유 때문에 “변하지 않는 var”만 의미합니다. @Bathsheba가 말한 것처럼 c ++의 기본 배열은 항상 고정 길이입니다.


답변

“일정한”이라는 용어는 실제로 모호하며 키워드 const가 잘못되었습니다.

const의미 : “초기화 후이 개체의 값을 변경할 수 없음” “컴파일 타임 상수”를 의미 하지는 않습니다 . 초기 값은 여전히 ​​런타임 소스에서 올 수 있습니다.

배열 바운드에 대한 컴파일 타임 상수가 필요합니다.

foo컴파일 타임 상수 라는 이름의 오브젝트 가 const 있고 리터럴 또는 constexpr사물 과 같은 상수 표현식에서 초기화 된 경우가 있습니다 . 그렇습니다 c; 의 경우에는 그렇지 않습니다 b.


답변