Функция-член boost::asio::io_service::run()
перегружена: одна версия не принимает аргументов, а другая версия принимает один аргумент.То есть получение адреса boost::asio::io_service::run
требует контекста, в котором компилятор может напрямую определить сигнатуру функции.Тем не менее, std::bind()
не требуется делать магию дедукции, в то время как кажется, что boost::bind()
пытается найти совпадающую перегрузку, т.е. кажется, что его первый тип аргумента легко ограничен (при условии, что пример boost действительно компилируется).
Чтобы обойти эту проблему, вы можете явно указать тип первого аргумента для std::bind()
(он также должен работать с boost::bind()
), например, так:
std::bind(static_cast<size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &io);
У меня нетпроверил, предъявляет ли стандарт какие-либо требования, но если он действительно не отвечает каким-либо требованиям, я бы рассмотрел реализацию, которая не идет к героизму, чтобы сделать тип аргумента более качественным, хотя он выполняет меньше работы:это требует, чтобы пользователь написал код, который может компилироваться без изменений на другом компиляторе.