Binders need to use decay to work correctly with references.
diff --git a/asio/include/asio/detail/bind_handler.hpp b/asio/include/asio/detail/bind_handler.hpp
index c01a7ac..617a196 100644
--- a/asio/include/asio/detail/bind_handler.hpp
+++ b/asio/include/asio/detail/bind_handler.hpp
@@ -21,6 +21,7 @@
#include "asio/detail/handler_alloc_helpers.hpp"
#include "asio/detail/handler_cont_helpers.hpp"
#include "asio/detail/handler_invoke_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
#include "asio/detail/push_options.hpp"
@@ -31,8 +32,9 @@
class binder1
{
public:
- binder1(int, ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1)
- : handler_(ASIO_MOVE_CAST(Handler)(handler)),
+ template <typename T>
+ binder1(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1)
+ : handler_(ASIO_MOVE_CAST(T)(handler)),
arg1_(arg1)
{
}
@@ -113,10 +115,10 @@
}
template <typename Handler, typename Arg1>
-inline binder1<Handler, Arg1> bind_handler(
+inline binder1<typename decay<Handler>::type, Arg1> bind_handler(
ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1)
{
- return binder1<Handler, Arg1>(0,
+ return binder1<typename decay<Handler>::type, Arg1>(0,
ASIO_MOVE_CAST(Handler)(handler), arg1);
}
@@ -124,9 +126,10 @@
class binder2
{
public:
- binder2(int, ASIO_MOVE_ARG(Handler) handler,
+ template <typename T>
+ binder2(int, ASIO_MOVE_ARG(T) handler,
const Arg1& arg1, const Arg2& arg2)
- : handler_(ASIO_MOVE_CAST(Handler)(handler)),
+ : handler_(ASIO_MOVE_CAST(T)(handler)),
arg1_(arg1),
arg2_(arg2)
{
@@ -213,10 +216,10 @@
}
template <typename Handler, typename Arg1, typename Arg2>
-inline binder2<Handler, Arg1, Arg2> bind_handler(
+inline binder2<typename decay<Handler>::type, Arg1, Arg2> bind_handler(
ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2)
{
- return binder2<Handler, Arg1, Arg2>(0,
+ return binder2<typename decay<Handler>::type, Arg1, Arg2>(0,
ASIO_MOVE_CAST(Handler)(handler), arg1, arg2);
}
diff --git a/asio/include/asio/impl/connect.hpp b/asio/include/asio/impl/connect.hpp
index 5c8650f..7da886f 100644
--- a/asio/include/asio/impl/connect.hpp
+++ b/asio/include/asio/impl/connect.hpp
@@ -301,7 +301,8 @@
{
ec = asio::error::not_found;
asio::post(socket_.get_executor(),
- detail::bind_handler(*this, ec));
+ detail::bind_handler(
+ ASIO_MOVE_CAST(range_connect_op)(*this), ec));
return;
}
@@ -455,7 +456,8 @@
{
ec = asio::error::not_found;
asio::post(socket_.get_executor(),
- detail::bind_handler(*this, ec));
+ detail::bind_handler(
+ ASIO_MOVE_CAST(iterator_connect_op)(*this), ec));
return;
}