2017-11-23 10 views
0

매우 이상한 경우입니다. 내가 두 번째에 컴파일 오류가 발생하지만, 첫 번째는 완벽하게 작동 않는 이유C++이 아닌 상수 배열 선언으로 컴파일 오류가 발생했습니다.

int n = 50; 
auto p1 = new double[n][5]; //OK 
auto p2 = new double[5][n]; //Error 

main.cpp: In function ‘int main()’:
main.cpp:17:26: error: array size in new-expression must be constant
auto p2 = new double[5][n]; //Error

main.cpp:17:26: error: the value of ‘n’ is not usable in a constant expression
main.cpp:15:8: note: ‘int n’ is not const

사람이 설명 할 수 : 코드를 살펴 보자?

+1

"컴파일 오류가 발생합니다"오류를 게시하지 않습니다. – Useless

+2

[컴파일러가 해당 행을 구문 분석하는 방법] (https://godbolt.org/g/y5eyXP)을 보는 데 도움이 될 수 있습니다. – TartanLlama

답변

7

new double[n][5]의 경우 double[5] 유형의 값을 n 개 할당합니다.

new double[5][n]으로 5variable-length arrays을 할당합니다. 그리고 C++에는 VLA가 없으므로 유효하지 않습니다.

용액 등 이제까지 std::vector을 사용하는 것이다

std::vector<std::vector<double>> p2(5, std::vector<double>(n)); 

double의 벡터의 벡터로 p2을 정의한다. 각각 n 값의 벡터로 초기화되는 5 요소의 크기를 갖도록 p2을 구성합니다.

1

는 귀하의 문제는 incidentially이 섹션 "설명"아래 cppreferencenew[] 표현 페이지에 (!? 재미)주는 정확한 예와 함께 설명한다. 발췌 부분 참조 :

If type is an array type, all dimensions other than the first must be specified as positive integral constant expression (until C++14) converted constant expression of type std::size_t (since C++14), but the first dimension may be any expression convertible to std::size_t. This is the only way to directly create an array with size defined at runtime, such arrays are often referred to as dynamic arrays.