Muy bien, quiero saber por qué este código está trabajando, sólo se dio cuenta de que tengo dos variables con el mismo nombre dentro del mismo alcance.
Parece confuso sobre los alcances. No están "dentro del mismo" ámbito ... el k del bucle for tiene su propio alcance anidado/interno. Más importante aún, para ver por qué el lenguaje lo permite, tener en cuenta:
#define DO_SOMETHING \
do { for (int i = 1; i <= 2; ++i) std::cout << i << '\n'; } while (false)
void f()
{
for (int i = 1; i <= 10; ++i)
DO_SOMETHING();
}
Aquí, el texto sustituido por la macro "hacer_algo" recibe evaluados en el mismo alcance que i. Si está escribiendo DO_SOMETHING, puede necesitar su expansión para almacenar algo en una variable y establecerse en el identificador i
; obviamente, no tiene forma de saber si ya existirá en el contexto de la llamada. Podrías tratar de elegir algo más oscuro, pero tendrías personas usando nombres complicados de variables que sufrieran el mantenimiento del código, y sin importar tarde o temprano habría un choque. Por lo tanto, el lenguaje solo permite que los ámbitos internos introduzcan variables con el mismo nombre: la coincidencia más interna se usa hasta que finaliza su alcance.
Incluso cuando no se trata de macros, es una pena tener que detenerse y pensar si algún ámbito externo ya está usando el mismo nombre. Si sabe que solo quiere una operación rápida, puede mostrarla en un alcance independiente (anidado) sin tener en cuenta ese contexto más amplio (siempre que no tenga un código allí que realmente quiera usar la variable de ámbito externo: si lo hace a continuación, puede especificarlo explícitamente (si está delimitado por espacios de nombres y clases, pero si está en un cuerpo de función, necesita cambiar el nombre de su variable de bucle (o crear una referencia o algo similar antes de presentar su nombre propio) variable)).
Prueba encender '-Wall', ¿podría quejarte más? –
'Tengo dos variables con el mismo nombre dentro del mismo alcance' ¿Dónde? –