Должен ли я видеть существенные различия между std::bind и boost::bind?

Я изучаю поддержку С++ 11 на g++-4.7 (Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, если быть точным) и, кажется, нахожу различия.

В частности, если я закомментирую #include <boost/bind.hpp> и систематически заменю boost::bind на std::bind в примере асинхронного клиента Boost ASIO (взято из http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp), программа больше не компилируется.

Любое объяснение этому?


person BD at Rivenhill    schedule 01.07.2013    source источник
comment
Не могли бы вы сделать замену, которая не работает (желательно одну замену), и опубликовать измененный код вместе с ошибкой компилятора?   -  person Praetorian    schedule 01.07.2013
comment
Я помню, что видел другое поведение с вложенными привязками. Не вспоминайте подробности прямо сейчас. Однако это не то, с чем вы здесь сталкиваетесь.   -  person sehe    schedule 02.07.2013


Ответы (2)


#include <functional>
namespace boost {
    namespace asio {
        namespace stdplaceholders {
            static decltype ( :: std :: placeholders :: _1 ) & error = :: std :: placeholders :: _1;
            static decltype ( :: std :: placeholders :: _2 ) & bytes_transferred = :: std :: placeholders :: _2;
            static decltype ( :: std :: placeholders :: _2 ) & iterator = :: std :: placeholders :: _2;
            static decltype ( :: std :: placeholders :: _2 ) & signal_number = :: std :: placeholders :: _2;
        }
    }
}

и используйте boost::asio::stdplaceholders::* вместо boost::asio::placeholders::*

person pal    schedule 01.07.2013

Похоже, что boost::asio::placeholders нельзя использовать вместе с std::bind. В примере, на который вы ссылаетесь, первый вызов boost::bind происходит в следующем коде:

resolver_.async_resolve(query,
    boost::bind(&client::handle_resolve, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::iterator));

Простая замена boost::bind на std::bind приводит к куче ошибок. Чтобы он скомпилировался, вам нужно заменить boost::asio::placeholders на std::placeholders.

resolver_.async_resolve(query,
    std::bind(&client::handle_resolve, this,
      std::placeholders::_1,
      std::placeholders::_2));

Обратите внимание, что я не проверял функционально тот же код после внесения этих изменений, а только то, что он компилируется.

person Praetorian    schedule 01.07.2013