2011-04-06 459 views

回答

35

當然,最簡單的方法就是嘗試調用空的std::function

int main() { 
    std::function<int()> intfunc; 
    int x = intfunc(); // BAD 
} 
+0

我只是做了一個搜索,不僅是你的例子最簡單,它也看起來像* only *例子! :-) – 2011-04-06 14:05:04

+0

@霍華德:真的嗎?那麼[這個答案](http://stackoverflow.com/questions/5556183/make-c-crash-without-casting/5557843#5557843)怎麼會拋出一個'bad_function_call'? – 2011-04-06 16:15:57

+4

我最好的猜測是,你引用的答案可以歸結爲DeadMG在這裏給出的答案:調用一個空的'std :: function'。對不起,我目前無法測試lambda代碼。我仔細檢查了最新的lambda規範,我發現那裏沒有拋出'bad_function_call'。我重新搜索了'bad_function_call'的最新草案,注意捕獲'bad_function_call'可能被複述的情況,並且沒有發現其他任何被拋出的情況。仍然有可能我錯過了一次。如果你找到它,請爲我們發佈一個指針。 – 2011-04-06 16:45:23

2

「執行函數調用,而不必目標調用拋出一個類型 的std :: bad_function_call的例外」

std::function<void(int,int)> f; 
    f(33,66); // throws std::bad_function_call 

的C無學分我....它的尼古拉約祖蒂斯權威人士++標準庫

+1

堆棧交換沒有采用「<>」附上的代碼! 「<>」代碼內的內容不可見。在你使我死亡之前.... ahem ... std :: function f; f(33,66); //拋出std :: bad_function_call – 2014-09-18 11:44:47

0

在我的情況是問題是在捕獲列表中。我有一個遞歸lambda函數。

//decl 
std::function<void(const SBone*, const core::vector3df&, const core::quaternion&)> f_build; 
f_build = [&f_build](const SBone* bone, const core::vector3df& pos, const core::quaternion& rot) 
{ 
... 
} 

丟失&從捕獲列表中的f_build生成一個壞的調用。