Commit cd92c25e authored by Dominik Charousset's avatar Dominik Charousset

Fix overly eager conversion in spawn_fwd

parent a3f250c1
...@@ -22,15 +22,28 @@ ...@@ -22,15 +22,28 @@
#include <type_traits> #include <type_traits>
#include "caf/actor.hpp" #include "caf/actor.hpp"
#include "caf/actor_traits.hpp"
namespace caf { namespace caf {
namespace detail { 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` /// 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. /// but simply forwards any other argument in the same way `std::forward` does.
template <class T> template <class T>
typename std::conditional<std::is_convertible<T, actor>::value, actor, typename std::conditional<
T&&>::type spawn_fwd_convert<typename std::remove_reference<T>::type>::value, actor,
T&&>::type
spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept { spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept {
return static_cast<T&&>(arg); return static_cast<T&&>(arg);
} }
...@@ -38,8 +51,9 @@ spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept { ...@@ -38,8 +51,9 @@ spawn_fwd(typename std::remove_reference<T>::type& arg) noexcept {
/// Converts `scoped_actor` and pointers to actors to handles of type `actor` /// 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. /// but simply forwards any other argument in the same way `std::forward` does.
template <class T> template <class T>
typename std::conditional<std::is_convertible<T, actor>::value, actor, typename std::conditional<
T&&>::type spawn_fwd_convert<typename std::remove_reference<T>::type>::value, actor,
T&&>::type
spawn_fwd(typename std::remove_reference<T>::type&& arg) noexcept { spawn_fwd(typename std::remove_reference<T>::type&& arg) noexcept {
static_assert(!std::is_lvalue_reference<T>::value, static_assert(!std::is_lvalue_reference<T>::value,
"silently converting an lvalue to an rvalue"); "silently converting an lvalue to an rvalue");
......
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