它可能從來沒有這樣實施,因爲它從來沒有需要。
假設你想要寫在純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++中,情況不再是這樣。 在以下示例中,函數2將比功能1慢:
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();
}
在這個例子中,函數2是簡單地無效。引用只能在聲明時賦值,而不能晚於賦值。 這意味着在這個例子中,編寫有效代碼的唯一方法是在變量真正初始化的時刻寫入聲明。不早。
這兩個示例都說明了爲什麼在C++中真正需要允許在其他可執行語句之後使用變量聲明,而不是像C中那樣在塊的開始處使用變量聲明。這解釋了爲什麼將它添加到C++而不是C(和其他語言),它不是真的需要。
Heh。這已經有一段時間了,但我記得它與無法在特定平臺上混合聲明/堆棧分配和代碼有關。之後,添加了嵌套塊,即使在這些平臺上(或多或少地將它們作爲內部函數處理),也允許有限的混合形式。雖然我沒有找到參考,而且時間很久以至於我不太相信自己的記憶,這就是爲什麼這個答案沒有被解決。 – geekosaur
爲什麼不問dmr?我給他發了一封電子郵件(他的地址是公開的,在他的網站上)。我將在這裏發佈任何回覆...儘管我希望他會創建一個賬戶並回答他自己:-) –