Programing

이 'for'루프가 유효하지 않은 이유는 무엇입니까?

crosscheck 2020. 11. 18. 08:34
반응형

이 '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;
        }
    }
}

(가) 주 &전에 rowcol있는 다른 설정, 당신은 참조가 아닌 행과 열의 사본을 원하는 나타내는 col0에 영향을 미치지 않을 것이다 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

반응형