Возможно, это ошибка в Boost.Hana. Конструктор overload_t
это:
template <typename F_, typename ...G_>
constexpr explicit overload_t(F_&& f, G_&& ...g)
: overload_t<F>::type(static_cast<F_&&>(f))
, overload_t<G...>::type(static_cast<G_&&>(g)...)
{ }
Обратите внимание, что это неограниченные ссылки на пересылку. Это общая проблема того, чтобы ссылочный конструктор пересылки был лучше, чем конструктор копирования, когда у вас есть неконстантный объект. Сокращенный пример:
struct X {
X();
template <typename F> X(F&&);
X(X const&) = default;
};
X x1;
X x2(x1); // does *not* call the copy constructor
Однако, если бы объект был const
, тогда конструктор копирования был бы лучшим соответствием. Итак, короткое решение состоит в том, чтобы просто сделать это:
struct mine
{
ptr_t ptr;
mine(ptr_t const& ptr) : ptr(ptr){}
};
А теперь он компилируется. Аналогично, как предлагает Якк, перемещение вместо копирования также будет работать по той же причине:
struct mine
{
ptr_t ptr;
mine(ptr_t ptr) : ptr(std::move(ptr)) {}
};