Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Guideline for how to declare variables in a range-based for loop

Abierto
#2,115 5 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
25/100
Tipo de issue
Documentación
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
cpp

Línea de trabajo

Comienza revisando las recomendaciones existentes de Con.1 y ES.71 y los cinco comentarios sobre este issue. Determina si la regla propuesta debería reemplazar o aclarar esas recomendaciones, incluidos los casos de range-based-for citados. Se considera terminado cuando se haya tomado una decisión y se haya documentado la recomendación acordada en la sección relevante de C++ Core Guidelines.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

A question which comes up every now and then is what type of loop variable you should use for range-based for, particularly when no mutation takes place.

// case (1) - cheap to copy
for (int x : container) // disallowed in this form by Con.1, should be 'const int'
// vs
for (const int &x : container)
// case (2) - expensive to copy
for (string x : container) // disallowed in this form by ES.71, should be 'const string &x'
// vs
for (const string &x : container)

I think we should recommend to always declare the loop variable as a reference, never as a value, and here's why:

  1. The rule is simple and consistent.
  2. When mutating a T& variable in the loop, you are already forced to follow it by the language.
  3. If you aren't, and you have case (2), then ES.71 already tells you to.
  4. Otherwise, if you are following Con.1, then const T x is only one character away from const T &x, so it costs very little effort to follow this rule.
  5. It is possible and relatively easy to enforce with automatic tooling.
  6. It prevents bugs related to taking the address of the local variable, instead of taking the address of the object within the container.
  7. Even for weird iterators like std::ranges::iota_view::iterator, where their reference is actually a value, this method is robust because const& allows for temporary materialization.

In essence, I don't see any benefit to non-reference loop variables, and the alternative is consistent, easy, correct by default, and already recommended in part.

Lenguaje dominante
CSS
Estrellas
45.3k
Forks
5.6k
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de isocpp/CppCoreGuidelines

Todos los issues de isocpp/CppCoreGuidelines

Issues similares

Más issues de Documentation

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.