Вероятно, он никогда не был реализован таким образом, потому что он никогда не был нужен.
Предположим, вы хотите написать что-то вроде этого на простом C:
int myfunction(int value)
{
if (value==0)
return 0;
int result = value * 2;
return result;
}
Тогда вы можете легко переписать это в действительный C, например:
int myfunction(int value)
{
int result;
if (value==0)
return 0;
result = value * 2;
return result;
}
Нет абсолютно никакого влияния на производительность, если сначала объявить переменную, а затем задать ее значение.
Однако в C ++ это уже не так.
В следующем примере function2 будет медленнее, чем 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();
}
В функции 2 необходимо создать переменную продукта, даже если фабрика не работает.
Позже фабрика производит продукт, а затем оператор присваивания должен скопировать продукт (из возвращаемого значения makeProduct в переменную продукта). В функции 1 продукт создается только во время работы фабрики, и даже тогда вызывается конструктор копирования, а не обычный конструктор и оператор присваивания.
Однако в настоящее время я ожидаю, что хороший компилятор C ++ оптимизирует этот код, но в первых компиляторах C ++ это, вероятно, было не так.
Второй пример:
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();
}
В этом примере function2 просто недействительна. Ссылкам можно присвоить значение только во время объявления, но не позже.
Это означает, что в этом примере единственный способ написать правильный код - это написать объявление в тот момент, когда переменная действительно инициализирована. Не раньше.
Оба примера показывают, почему в C ++ действительно было необходимо разрешать объявления переменных после других исполняемых операторов, а не в начале блока, как в C.
Это объясняет, почему это было добавлено в C ++, а не в C (и другие языки), где это действительно не нужно.