Lambda返回引用会导致分段错误 - 为什么?

时间:2013-08-19 22:59:46

标签: c++ c++11 lambda crash segmentation-fault

以下代码为straight out of one of my projects。第一个版本导致崩溃(分段错误)。第二个版本按预期工作。

两个代码段不等同吗?


这一次崩溃

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
};

使用的编译器: clang ++ 3.4 - 它也无法推断出getUserFromPacket的返回类型。 usersUserDB的一个实例。函数签名是User& UserDB::getUser(const std::string&) - 为什么编译器无法推导出User&作为返回类型?

1 个答案:

答案 0 :(得分:2)

不,他们不等同。第一个将引用lambda,它可能在需要时不在范围内。第二个没有这种依赖。一定要小心捕捉参考。 :)