请问代码里引用的值为什么没被修改
请教代码里引用的值为什么没被修改
------解决方案--------------------
关键在boost::bind上面。
你可以将 dt.async_wait(boost::bind(&print, boost::asio::placeholders::error, &dt, count));
改为 dt.async_wait(boost::bind(&print, boost::asio::placeholders::error, &dt, boost::ref(count)));
因为boost::bind在包装时是把参数拷贝过去以后才传给函数的,即boost::bind使用了传值调用,而boost::ref就是为了解决这个问题的。显然ref是reference的缩写。
------解决方案--------------------
- C/C++ code
void print(const boost::system::error_code& /*e*/, boost::asio::deadline_timer* dt_ptr, int& count) { if (count < 5) { std::cout << count << " " << std::endl; ++count; dt_ptr->expires_at(dt_ptr->expires_at() + boost::posix_time::seconds(1)); dt_ptr->async_wait(boost::bind(print, boost::asio::placeholders::error, dt_ptr, count)); } } int main() { boost::asio::io_service io_ser; int count = 0; boost::asio::deadline_timer dt(io_ser, boost::posix_time::seconds(1)); dt.async_wait(boost::bind(&print, boost::asio::placeholders::error, &dt, count)); io_ser.run(); std::cout << "final count is " << count << " "; // 这里输出还是0,为什么呢 return 0; }
------解决方案--------------------
关键在boost::bind上面。
你可以将 dt.async_wait(boost::bind(&print, boost::asio::placeholders::error, &dt, count));
改为 dt.async_wait(boost::bind(&print, boost::asio::placeholders::error, &dt, boost::ref(count)));
因为boost::bind在包装时是把参数拷贝过去以后才传给函数的,即boost::bind使用了传值调用,而boost::ref就是为了解决这个问题的。显然ref是reference的缩写。
------解决方案--------------------