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 - 它也不能推斷返回類型getUserFromPacket
。 users
是UserDB
的一個實例。函數簽名是User& UserDB::getUser(const std::string&)
- 爲什麼編譯器無法推導出User&
作爲返回類型?
當'pHandler [']'被調用時'getUserFromPacket'仍然存在嗎? – GManNickG
@GManNickG:我現在感覺非常愚蠢。我通過引用捕獲'getUserFromPacket',它的生命週期太短。發佈它作爲答案,我會接受它。 –
適合每個人。 :) – GManNickG