Waarom is deze ‘for’-lus niet geldig?

Uit C++ Primer 5th Edition door Lippman, pagina 182, overweeg:

int ia[3][4];
for (auto row : ia)
        for (auto col : row)

De eerste forherhaalt zich door ia, waarvan de elementen arrays van grootte 4 zijn.
Omdat rowgeen referentie is, zal de compiler, wanneer de compiler rowinitialiseert, elk array-element converteren (zoals elk ander object van array
type) naar een pointer naar het eerste element van die array.
Dientengevolge, in deze
loop het type rowis int*.

Ik weet niet zeker of ik begrijp hoe deze auto werkt, maar als ik kan aannemen dat het automatisch een type aan een rij geeft op basis van het type iaarrayleden, maar ik begrijp niet waarom dit soort for, waarbij rij geen referentie is, is niet geldig. Waarom gaat dit gebeuren? “pointer naar het eerste element van die array”, waarom?


Antwoord 1, autoriteit 100%

Het probleem is dat roween int *is en niet een int[4]zoals je zou verwachten omdat arrays vervallen tot pointers en er is geen automatische manier om te weten naar hoeveel elementen een aanwijzer verwijst.

Om dat probleem te omzeilen is std::arraytoegevoegd waar alles werkt zoals verwacht:

#include <array>
int main() {
    std::array<std::array<int, 4>, 3> ia;
    for (auto &row : ia){
        for (auto &col : row){
            col = 0;
        }
    }
}

Let op de &vóór rowen coldie aangeven dat u een verwijzing wilt en geen kopie van de rijen en kolommen, anders het instellen van colop 0 heeft geen effect op ia.


Antwoord 2, autoriteit 52%

Om het verval van de int[]naar int*te voorkomen, kun je &&

gebruiken

int main() {
    int ia[3][4];
    for (auto && row : ia)
        for (auto && col : row)
            ;
}

Other episodes