這可能是一個哲學問題,但我遇到了以下問題:爲什麼std :: function實例有一個默認的構造函數?
如果你定義一個std ::功能,你不正確初始化它,你的應用程序會崩潰,就像這樣:
typedef std::function<void(void)> MyFunctionType;
MyFunctionType myFunction;
myFunction();
如果函數作爲參數傳遞,就像這樣:
void DoSomething (MyFunctionType myFunction)
{
myFunction();
}
然後,當然,它也崩潰。這意味着,我不得不像下面這樣添加校驗碼:
void DoSomething (MyFunctionType myFunction)
{
if (!myFunction) return;
myFunction();
}
要求這些支票給了我一個閃回舊的C日子裏,在那裏你也必須明確地檢查所有指針參數:
void DoSomething (Car *car, Person *person)
{
if (!car) return; // In real applications, this would be an assert of course
if (!person) return; // In real applications, this would be an assert of course
...
}
幸運的是,我們可以在C++,它阻止我寫這些檢查(假設呼叫者沒有一個nullptr的內容傳遞給函數使用引用:
void DoSomething (Car &car, Person &person)
{
// I can assume that car and person are valid
}
所以,WH做std ::函數實例有一個默認的構造函數?沒有默認的構造函數,你就不需要添加檢查,就像函數的其他普通參數一樣。 在那些你想傳遞'可選'std :: function的'罕見'情況下,你仍然可以傳遞一個指針給它(或者使用boost :: optional)。
它不會崩潰;它會拋出一個異常。 –
閱讀關於'functors':http://www.sgi.com/tech/stl/functors.html –
「我不得不添加檢查代碼」 - 恥辱,你的呼叫者不能修復他們的代碼。似乎很奇怪,爲了挽救他們需要處理異常而放棄。儘管如此,它可能更糟糕,如果你使用了一個函數指針,並且他們不打算初始化它,那麼它會有一個不確定的值,行爲將是未定義的。他們可能把調用'strlen'的方法糟糕得多,而不是調用你的函數。 –