以下のコードの動作を理解できません。 シンボルBUG
を定義するとき、変数this
の3番目の印刷が間違っています。boost resolve :: async_resolveを呼び出すときにキャプチャされた値の値が正しくない
私はコードに壊れている方法resolver::async_resolve
に何かがあると思います。私はあなたのバグがconst参照によって対値でConnect
に渡しによるものではないおかげ
#include <boost/asio.hpp>
#include <iostream>
using namespace std;
template <typename F>
#ifdef BUG
void Connect(boost::asio::ip::tcp::resolver& resolver, F Connected)
#else
void Connect(boost::asio::ip::tcp::resolver& resolver, const F& Connected)
#endif
{
resolver.async_resolve(
boost::asio::ip::tcp::resolver::query{ "localhost", "8088" },
[&Connected](const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator i)
{
Connected();
}
);
}
struct Test
{
void Start()
{
cout << "this1 " << hex << this << dec << endl;
auto handler = [this]()
{
cout << "this2 " << hex << this << dec << endl;
boost::asio::ip::tcp::resolver resolver{ ios };
Connect(resolver, [this]()
{
cout << "this3 " << hex << this << dec << std::endl;
}
);
};
handler();
ios.run();
}
boost::asio::io_service ios;
};
int main()
{
Test t;
t.Start();
}
どうもありがとう、非常に明確に
Connected
をキャプチャすることによりこの問題を解決することができます。それは、(IMHO)にスポットするバグトリッキーの一種です。私はラムダが割り当てられた別のオブジェクトスタックであることを覚えておく必要があるので、参考にして渡すのが慎重でなければなりません...誰でもこの種の問題を避けるためのガイドラインを提案できますか? –