반응형
이 'for'루프가 유효하지 않은 이유는 무엇입니까?
Lippman의 C ++ Primer 5th Edition, 페이지 182에서 다음을 고려하십시오.
int ia[3][4];
for (auto row : ia)
for (auto col : row)
첫 번째
for
는 요소가 크기 4 인 배열 인 ia를 반복 합니다. 참조가 아니기 때문에row
컴파일러가 초기화row
할 때 각 배열 요소 (배열 유형의 다른 개체와 마찬가지로)를 해당 배열의 첫 번째 요소에 대한 포인터로 변환합니다. 결과적으로이 루프에서 유형은row
입니다int*
.
이 자동이 어떻게 작동하는지 잘 모르겠지만 ia
배열 멤버 유형을 기반으로 행에 자동으로 유형을 제공한다고 가정 할 수 있지만 for
행이 참조가 아닌 이런 종류의 , 유효하지 않습니다. 왜 이런 일이 일어날까요? "그 배열의 첫 번째 요소에 대한 포인터" , 무엇 때문에?
문제는 즉 row
이다 int *
아닌 int[4]
배열은 포인터로 붕괴 얼마나 많은 요소의 포인터 포인트에 알 수있는 자동 방법이 없기 때문에 사람이 기대하는 것처럼.
이 문제를 해결하기 위해 std::array
모든 것이 예상대로 작동하는 곳에 추가되었습니다.
#include <array>
int main() {
std::array<std::array<int, 4>, 3> ia;
for (auto &row : ia){
for (auto &col : row){
col = 0;
}
}
}
(가) 주 &
전에 row
와 col
있는 다른 설정, 당신은 참조가 아닌 행과 열의 사본을 원하는 나타내는 col
0에 영향을 미치지 않을 것이다 ia
.
의 붕괴를 방지하기 int[]
에 int*
사용할 수있는&&
int main() {
int ia[3][4];
for (auto && row : ia)
for (auto && col : row)
;
}
참고 URL : https://stackoverflow.com/questions/34980920/why-isnt-this-for-loop-valid
반응형
'Programing' 카테고리의 다른 글
javascript int를 float로 변환 (0) | 2020.11.18 |
---|---|
Webdav 또는 FTP 중 어떤 파일 액세스가 가장 좋습니까? (0) | 2020.11.18 |
Ruby on Rails 내에서 안전한 REST API를 구축하기위한 제안을 찾고 있습니다. (0) | 2020.11.18 |
VB.NET에서 문자열을 결합하기위한 +와 &의 차이점 (0) | 2020.11.18 |
Linux에서 ELF 파일의 데이터 섹션 내용을 어떻게 검사 할 수 있습니까? (0) | 2020.11.18 |