2013-08-19 80 views
1

下面的代碼是straight out of one of my projects。第一個版本導致崩潰(分段故障)。第二個版本按預期工作。返回參考的Lambda導致分段錯誤 - 爲什麼?

不是兩段代碼相同呢?


這一個崩潰

auto getUserFromPacket = [&](sf::Packet& mP) -> User& 
{ 
    return users.getUser(ssvuj::as<std::string>(getDecompressedPacket(mP), 0)); 
}; 
pHandler[FromClient::US_Death] = [&](ClientHandler&, sf::Packet& mP)   
{ 
    getUserFromPacket(mP).stats.deaths += 1; // segmentation fault here! 
}; 

這一個工程

pHandler[FromClient::US_Death] = [&](ClientHandler&, sf::Packet& mP)   
{ 
    users.getUser(ssvuj::as<std::string>(getDecompressedPacket(mP), 0)).stats.deaths += 1; 
    // this works fine 
}; 

使用的編譯器:鏗鏘++ 3.4 - 它也不能推斷返回類型getUserFromPacketusersUserDB的一個實例。函數簽名是User& UserDB::getUser(const std::string&) - 爲什麼編譯器無法推導出User&作爲返回類型?

+1

當'pHandler [']'被調用時'getUserFromPacket'仍然存在嗎? – GManNickG

+0

@GManNickG:我現在感覺非常愚蠢。我通過引用捕獲'getUserFromPacket',它的生命週期太短。發佈它作爲答案,我會接受它。 –

+0

適合每個人。 :) – GManNickG

回答

2

不,它們不是等效的。第一個將引用lambda,它可能不會在需要的時間範圍內。第二個沒有這樣的依賴。請始終小心參照。 :)