C++ 为什么可以';t boost::hana::重载\u不能是类的成员

C++ 为什么可以';t boost::hana::重载\u不能是类的成员,c++,c++14,overloading,boost-hana,C++,C++14,Overloading,Boost Hana,我有两个函数,我得到了一个神奇的函数对象,它提供了重载解析: void foo1(); void foo2(int); auto foo_ptr = boost::hana::overload(foo1,foo2); //Later foo_ptr(12); //Both Valid (Yeah!) foo_ptr(); 但当我这样做时,问题就出现了: using ptr_t = decltype(foo_ptr); struct mine { ptr_t ptr; m

我有两个函数,我得到了一个神奇的函数对象,它提供了重载解析:

void foo1();
void foo2(int);


auto foo_ptr = boost::hana::overload(foo1,foo2);
//Later
foo_ptr(12);  //Both Valid (Yeah!)
foo_ptr();
但当我这样做时,问题就出现了:

using ptr_t = decltype(foo_ptr);

struct mine
{
    ptr_t ptr;
    mine(ptr_t ptr) : ptr(ptr){}
};


mine m(foo_ptr);
当我试图编译这段代码时,我得到
错误:调用'boost::hana::overload\u t::overload\u t()'时没有匹配的函数。

你自己看看

现在我的问题是:


我是否可以复制这些重载对象(hana的文档中没有说明这种或那种方式),如果是这样,为什么当我将其作为成员放入类中时会失败?

这可以说是Boost.hana中的一个bug。建造商是:

现在它编译了。同样,正如雅克所建议的,移动而不是复制也会起到同样的作用:

struct mine
{
    ptr_t ptr;
    mine(ptr_t ptr) : ptr(std::move(ptr)) {}
};

从错误中,它试图调用默认构造函数。如果你通过引用将ptr传递给我的话会发生什么?@1201程序如果我通过常量引用将ptr传递给我的话,它会因为某种原因起作用……我认为移动ctor也会很诱人;在
mine(ptr_t ptr)中:ptr(std::move(ptr)){}
struct X {
    X();
    template <typename F> X(F&&); 
    X(X const&) = default;
};

X x1;
X x2(x1); // does *not* call the copy constructor
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)) {}
};