1

以下代码直接取自我的一个项目。第一个版本导致崩溃(分段错误)。第二个版本按预期工作。

这两个代码片段不是等效的吗?


这个崩溃

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&为返回类型?

4

1 回答 1

2

不,它们不相等。第一个将引用 lambda,它(可能)在需要时不在范围内。第二个没有这种依赖性。始终小心通过引用捕获。:)

于 2013-08-19T23:06:38.770 回答