1

次のコードは、私のプロジェクトの 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 - また、 の戻り値の型を推測できませんでしたgetUserFromPacketusersのインスタンスですUserDB。関数のシグネチャは- コンパイラが戻り値の型User& UserDB::getUser(const std::string&)を推測できないのはなぜですか?User&

4

1 に答える 1

2

いいえ、それらは同等ではありません。最初のものはラムダを参照しますが、これは (おそらく) 必要になるまでには範囲外になります。2 番目には、そのような依存関係はありません。参照によるキャプチャには常に注意してください。:)

于 2013-08-19T23:06:38.770 に答える