Change type of concurrency_hint to int.
diff --git a/asio/include/asio/detail/impl/scheduler.ipp b/asio/include/asio/detail/impl/scheduler.ipp
index 6bc9cf0..91d5794 100644
--- a/asio/include/asio/detail/impl/scheduler.ipp
+++ b/asio/include/asio/detail/impl/scheduler.ipp
@@ -84,7 +84,7 @@
 };
 
 scheduler::scheduler(
-    asio::execution_context& ctx, std::size_t concurrency_hint)
+    asio::execution_context& ctx, int concurrency_hint)
   : asio::detail::execution_context_service_base<scheduler>(ctx),
     one_thread_(concurrency_hint == 1),
     mutex_(),
diff --git a/asio/include/asio/detail/impl/win_iocp_io_context.ipp b/asio/include/asio/detail/impl/win_iocp_io_context.ipp
index bf5a20f..3bc1a8d 100644
--- a/asio/include/asio/detail/impl/win_iocp_io_context.ipp
+++ b/asio/include/asio/detail/impl/win_iocp_io_context.ipp
@@ -62,7 +62,7 @@
 };
 
 win_iocp_io_context::win_iocp_io_context(
-    asio::execution_context& ctx, size_t concurrency_hint)
+    asio::execution_context& ctx, int concurrency_hint)
   : execution_context_service_base<win_iocp_io_context>(ctx),
     iocp_(),
     outstanding_work_(0),
@@ -75,8 +75,7 @@
   ASIO_HANDLER_TRACKING_INIT;
 
   iocp_.handle = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0,
-      static_cast<DWORD>(concurrency_hint < DWORD(~0)
-        ? concurrency_hint : DWORD(~0)));
+      static_cast<DWORD>(concurrency_hint >= 0 ? concurrency_hint : DWORD(~0)));
   if (!iocp_.handle)
   {
     DWORD last_error = ::GetLastError();
diff --git a/asio/include/asio/detail/scheduler.hpp b/asio/include/asio/detail/scheduler.hpp
index 6bdcfbb..fb86f53 100644
--- a/asio/include/asio/detail/scheduler.hpp
+++ b/asio/include/asio/detail/scheduler.hpp
@@ -44,7 +44,7 @@
   // Constructor. Specifies the number of concurrent threads that are likely to
   // run the scheduler. If set to 1 certain optimisation are performed.
   ASIO_DECL scheduler(asio::execution_context& ctx,
-      std::size_t concurrency_hint = 0);
+      int concurrency_hint = 0);
 
   // Destroy all user-defined handler objects owned by the service.
   ASIO_DECL void shutdown();
diff --git a/asio/include/asio/detail/win_iocp_io_context.hpp b/asio/include/asio/detail/win_iocp_io_context.hpp
index ffb8c3b..e6a25c4 100644
--- a/asio/include/asio/detail/win_iocp_io_context.hpp
+++ b/asio/include/asio/detail/win_iocp_io_context.hpp
@@ -48,7 +48,7 @@
   // Constructor. Specifies a concurrency hint that is passed through to the
   // underlying I/O completion port.
   ASIO_DECL win_iocp_io_context(asio::execution_context& ctx,
-      size_t concurrency_hint = 0);
+      int concurrency_hint = -1);
 
   // Destroy all user-defined handler objects owned by the service.
   ASIO_DECL void shutdown();
diff --git a/asio/include/asio/impl/io_context.ipp b/asio/include/asio/impl/io_context.ipp
index 2cce94b..a1d5959 100644
--- a/asio/include/asio/impl/io_context.ipp
+++ b/asio/include/asio/impl/io_context.ipp
@@ -33,21 +33,20 @@
 namespace asio {
 
 io_context::io_context()
-  : impl_(create_impl())
+  : impl_(add_impl(new impl_type(*this)))
 {
 }
 
-io_context::io_context(std::size_t concurrency_hint)
-  : impl_(create_impl(concurrency_hint))
+io_context::io_context(int concurrency_hint)
+  : impl_(add_impl(new impl_type(*this, concurrency_hint)))
 {
 }
 
-io_context::impl_type& io_context::create_impl(std::size_t concurrency_hint)
+io_context::impl_type& io_context::add_impl(io_context::impl_type* impl)
 {
-  asio::detail::scoped_ptr<impl_type> impl(
-      new impl_type(*this, concurrency_hint));
-  asio::add_service<impl_type>(*this, impl.get());
-  return *impl.release();
+  asio::detail::scoped_ptr<impl_type> scoped_impl(impl);
+  asio::add_service<impl_type>(*this, scoped_impl.get());
+  return *scoped_impl.release();
 }
 
 io_context::~io_context()
diff --git a/asio/include/asio/io_context.hpp b/asio/include/asio/io_context.hpp
index 2f92a6d..7fb49a9 100644
--- a/asio/include/asio/io_context.hpp
+++ b/asio/include/asio/io_context.hpp
@@ -170,7 +170,7 @@
    * @param concurrency_hint A suggestion to the implementation on how many
    * threads it should allow to run simultaneously.
    */
-  ASIO_DECL explicit io_context(std::size_t concurrency_hint);
+  ASIO_DECL explicit io_context(int concurrency_hint);
 
   /// Destructor.
   /**
@@ -479,8 +479,8 @@
 #endif // !defined(ASIO_NO_DEPRECATED)
 
 private:
-  // Helper function to create the implementation.
-  ASIO_DECL impl_type& create_impl(std::size_t concurrency_hint = 0);
+  // Helper function to add the implementation.
+  ASIO_DECL impl_type& add_impl(impl_type* impl);
 
   // Backwards compatible overload for use with services derived from
   // io_context::service.