以下代码直接取自我的一个项目。第一个版本导致崩溃(分段错误)。第二个版本按预期工作。
这两个代码片段不是等效的吗?
这个崩溃
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&
为返回类型?