为什么`boost :: bind()`不能用`std :: bind()`替换?

时间:2013-11-23 03:52:11

标签: c++ boost c++11 bind boost-asio

来自example的这部分代码:

int main()
{
  boost::asio::io_service io;
  printer p(io);
  boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
  io.run();
  t.join();

  return 0;
}

如果我将boost::bind(&boost::asio::io_service::run, &io)替换为std::bind(&boost::asio::io_service::run, &io),我会收到编译错误:

.../usr/lib/c++/v1/functional:1843:1: note: candidate template
  ignored: couldn't infer template argument '_Fp'
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
^
/usr/lib/c++/v1/functional:1852:1: note: candidate template
  ignored: couldn't infer template argument '_Rp'
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
^
1 error generated.

为什么会发生这种错误?

为什么std::bind(&printer::print1, &p)有效,但std::bind(&boost::asio::io_service::run, &io)不起作用?

1 个答案:

答案 0 :(得分:3)

编译器告诉你它无法找出std::bind的第一个参数的类型。

如果查看io_service::run,您会发现它已超载。编译器有一个选择,这是编译器无法确定类型的可能原因。要对此进行测试,您可以使用强制转换:

std::bind(static_cast<size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &io)

这种方式使代码中的选择显而易见。

使用现代编译器,您根本不需要使用bind。你可以这样做:

[&]() { io.run(); }

这可以避免std::bind模板的所有问题。您需要考虑变量生命周期和副本与引用。