Probablemente nunca fue implementado de esa manera, porque nunca fue necesario.
Supongamos que quiere escribir algo como esto en C plano:
int myfunction(int value)
{
if (value==0)
return 0;
int result = value * 2;
return result;
}
A continuación, puede volver a escribir fácilmente esta en válida C, así:
int myfunction(int value)
{
int result;
if (value==0)
return 0;
result = value * 2;
return result;
}
No hay absolutamente ningún impacto en el rendimiento por primero declarando la variable, luego estableciendo su valor.
Sin embargo, en C++, este ya no es el caso. En el siguiente ejemplo, function2 será más lenta que function1:
double function1(const Factory &factory)
{
if (!factory.isWorking())
return 0;
Product product(factory.makeProduct());
return product.getQuantity();
}
double function2(const Factory &factory)
{
Product product;
if (!factory.isWorking())
return 0;
product = factory.makeProduct();
return product.getQuantity();
}
En function2 la variable producto tiene que ser construido, incluso cuando la fábrica no está funcionando. Más tarde, la fábrica fabrica el producto y luego el operador de asignación necesita copiar el producto (desde el valor de retorno de makeProduct a la variable del producto). En la función 1, el producto solo se construye cuando la fábrica está funcionando, e incluso entonces, se llama al constructor de copia, no al constructor normal y al operador de asignación.
Sin embargo, esperaría hoy en día que un buen compilador de C++ podría optimizar este código, pero en los primeros compiladores de C++ probablemente este no era el caso.
Un segundo ejemplo es la siguiente:
double function1(const Factory &factory)
{
if (!factory.isWorking())
return 0;
Product &product = factory.getProduct();
return product.getQuantity();
}
double function2(const Factory &factory)
{
Product &product;
if (!factory.isWorking())
return 0;
product = factory.getProduct(); // Invalid. You can't assign to a reference.
return product.getQuantity();
}
En este ejemplo, function2 es simplemente no válido. A las referencias solo se les puede asignar un valor en el momento de la declaración, no más tarde. Esto significa que en este ejemplo, la única forma de escribir código válido es escribir la declaración en el momento en que la variable realmente se inicializa. No antes.
Ambos ejemplos muestran por qué era realmente necesario en C++ para permitir declaraciones de variables después de otras instrucciones ejecutables, y no al principio del bloque como en C. Esto explica por qué esto se agregó a C++ y no a C (y otros idiomas) donde no es realmente necesario.
Heh. Ha pasado un tiempo, pero recuerdo que está relacionado con la incapacidad de mezclar declaraciones/asignaciones de pila y código en plataformas particulares. Más tarde, se agregaron bloques anidados para permitir una forma limitada de mezcla incluso en esas plataformas (que las trataban como funciones internas, más o menos). Sin embargo, no encuentro referencias, y hace mucho tiempo que no confío plenamente en mi memoria, y esta es la razón por la que esto no está en las respuestas. – geekosaur
¿Por qué no preguntas a dmr? Le envié un correo electrónico (su dirección está públicamente disponible, en su sitio web). Publicaré cualquier respuesta que obtenga aquí ... aunque espero que él cree una cuenta y se responda a sí mismo :-) –