Uit C++ Primer 5th Edition door Lippman, pagina 182, overweeg:
int ia[3][4];
for (auto row : ia)
for (auto col : row)
De eerste
for
herhaalt zich door ia, waarvan de elementen arrays van grootte 4 zijn.
Omdatrow
geen referentie is, zal de compiler, wanneer de compilerrow
initialiseert, 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 typerow
isint*
.
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 ia
arrayleden, 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 row
een 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::array
toegevoegd 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 row
en col
die aangeven dat u een verwijzing wilt en geen kopie van de rijen en kolommen, anders het instellen van col
op 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)
;
}