我剛剛在代碼中發現了一個令人討厭的bug,因爲我通過引用獲取了一個字符串的const引用。到lambda運行時,原始字符串對象已經很久了,引用的值是空的,而目的是它將包含原始字符串的值,因此是錯誤。lambda:應該通過引用捕獲const引用yield undefined behavior?
什麼令我感到困惑的是,這並沒有調用運行時崩潰:畢竟,不應該因爲據我所知有一個懸空參考這個是不確定的行爲?而且,當在調試器下查看id時,它甚至不會看起來像垃圾,而只是一個正確構造的空字符串。
這裏的測試案例;這只是打印一個空行:
typedef std::vector< std::function< void() > > functions;
void AddFunction(const std::string& id, functions& funs)
{
funs.push_back([&id]()
{
//the type of id is const std::string&, but there
//is no object to reference. UB?
std::cout << id << std::endl;
});
}
int main()
{
functions funs;
AddFunction("id", funs);
funs[ 0 ]();
}
你又爲const引用結合:( –
是的,我已經知道了,幸運的是,單元測試指出了這一點 – stijn
你可能已經不太幸運臨時的受害者,它可能已經工作沒有問題的。試想一下,編譯器調整AddFunction'調用之後'棧,但是在臨時居住的堆棧區仍然完好無損。後來有一天,KABOOM! –