30 votes

Pourquoi la référence const peut-elle être réaffectée dans for-statement?

Je suis nouveau en C ++, et je suis confus à ce sujet:

 vector<int> v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1];  // compiler will show error.
 

Je comprends que la référence const r1 ne peut pas être réaffectée. Mais regardez les codes ci-dessous:

 for (const int &r2 : v) cout << r2;
 

Pourquoi cela ne se passerait-il pas? La référence const r2 est affectée deux fois, non?

35voto

user2079303 Points 4916

Non, ce n'est pas attribué deux fois. r2 existe depuis le début de l'itération jusqu'à la fin de l'itération. r2 dans l'itération suivante est une autre variable du même nom. Chaque itération a son propre r2 et chacun d'eux est initialisé séparément.

24voto

sergej Points 1749

Selon la norme C ++ [stmt.ranged] :

 for (const int &r2 : v) std::cout << r2;
 

est équivalent à:

 {
    auto && __range = (v);
    for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin)
    {
        const int &r2 = *__begin; // <-- new variable in each iteration
        std::cout << r2;
    }
}
 

Démo

La référence const r2 est affectée deux fois, non?

Non. Il y a une nouvelle variable r2 dans chaque itération.

6voto

SingerOfTheFall Points 9936

La distance basée for ressemble à ceci:

attr(facultatif) pour ( range_declaration : range_expression ) loop_statement

range_declaration est

range_declaration - une déclaration d'une variable nommée, dont le type est le type de l'élément de la séquence représentée par range_expression, ou une référence à ce type. Souvent utilise l'auto spécificateur de type automatique déduction

Donc, à chaque itération, une nouvelle déclaration est introduite, la référence n'existe que jusqu'à la prochaine itération de boucle.

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