次のコードは、私のプロジェクトの 1 つからそのまま取り出したものです。最初のバージョンではクラッシュ (セグメンテーション違反) が発生します。2 番目のバージョンは意図したとおりに機能します。
2 つのコード スニペットは同等ではありませんか?
こいつはクラッシュする
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&