以下代码为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
的返回类型。 users
是UserDB
的一个实例。函数签名是User& UserDB::getUser(const std::string&)
- 为什么编译器无法推导出User&
作为返回类型?
答案 0 :(得分:2)
不,他们不等同。第一个将引用lambda,它可能在需要时不在范围内。第二个没有这种依赖。一定要小心捕捉参考。 :)