Commit cd92c25e authored by Dominik Charousset's avatar Dominik Charousset

Fix overly eager conversion in spawn_fwd

parent a3f250c1
......@@ -22,14 +22,27 @@
#include <type_traits>
#include "caf/actor.hpp"
#include "caf/actor_traits.hpp"
namespace caf {
namespace detail {
template <class T>
struct spawn_fwd_convert : std::false_type {};
template <>
struct spawn_fwd_convert<scoped_actor> : std::true_type {};
template <class T>
struct spawn_fwd_convert<T*> {
static constexpr bool value = actor_traits<T>::is_dynamically_typed;
};
/// Converts `scoped_actor` and pointers to actors to handles of type `actor`
/// but simply forwards any other argument in the same way `std::forward` does.
template <class T>
typename std::conditional<std::is_convertible<T, actor>::value, actor,
typename std::conditional<
spawn_fwd_convert<typename std::remove_reference<T>::type>::value, actor,
T&&>::type
spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept {
return static_cast<T&&>(arg);
......@@ -38,7 +51,8 @@ spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept {
/// Converts `scoped_actor` and pointers to actors to handles of type `actor`
/// but simply forwards any other argument in the same way `std::forward` does.
template <class T>
typename std::conditional<std::is_convertible<T, actor>::value, actor,
typename std::conditional<
spawn_fwd_convert<typename std::remove_reference<T>::type>::value, actor,
T&&>::type
spawn_fwd(typename std::remove_reference<T>::type&& arg) noexcept {
static_assert(!std::is_lvalue_reference<T>::value,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment