64 votes

Pourquoi cette boucle 'for' n'est-elle pas valide ?

Pensez-y :

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

Le premier for itère sur ia, dont les éléments sont des tableaux de taille 4. Parce que row n'est pas une référence, lorsque le compilateur initialise row il convertira chaque élément du tableau (comme tout autre objet de type tableau) en un pointeur vers le premier élément du tableau. ) en un pointeur vers le premier élément de ce tableau. Par conséquent, dans cette le type de row est int* .

Je ne suis pas vraiment sûr de comprendre le fonctionnement de cet auto, mais si je peux supposer qu'il donne automatiquement un type à une ligne sur la base de ia type de membres de tableau, mais je ne comprends pas pourquoi ce type de for où row n'est pas une référence, n'est pas valide. Pourquoi cela se produit-il ? "pointeur vers le premier élément de ce tableau" à cause de quoi ?

69voto

nwp Points 1665

Le problème est que row est un int * et non un int[4] comme on pourrait s'y attendre, car les tableaux se décomposent en pointeurs et il n'y a pas de moyen automatique de savoir combien d'éléments un pointeur pointe.

Pour contourner ce problème std::array a été ajouté et tout fonctionne comme prévu :

#include <array>

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

Notez le & avant row y col qui indiquent que vous voulez une référence et non une copie des lignes et des colonnes, sinon la mise en place de col à 0 n'aurait aucun effet sur ia .

38voto

Thomas Points 2676

Pour éviter la dégradation de la int[] a int* vous pouvez utiliser &&

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X