2
我无法理解下面代码的行为。 定义符号BUG
时,变量this
的第三个输出是错误的。调用boost解析函数时捕获值错误:: async_resolve
我认为在方法resolver::async_resolve
中有些东西会破坏代码。我想了解什么:-)
感谢
#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();
}
非常感谢,非常明确的解决这个问题。这是一种棘手的问题(恕我直言)。我必须记住,lambda只是另一个对象栈分配,所以我应该小心地通过引用来传递它......任何人都可以提出任何指导原则来避免这种问题的第一位? –