代码之家  ›  专栏  ›  技术社区  ›  DarthRubik

为什么不能提升::hana::overload不属于类的成员

  •  2
  • DarthRubik  · 技术社区  · 8 年前

    所以我有几个函数,我得到了一个神奇的函数对象,它提供了关于以下内容的过载分辨率:

    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);
    

    当我试图编译这个代码时,我得到 error: no matching function for call to 'boost::hana::overload_t<void (*)(int)>::overload_t()' .

    你自己看看 godbolt ……

    现在我的问题是:

    是否允许我复制这些重载对象(HANA的文档没有这样或那样说),如果允许,为什么当我将它作为一个成员放入类中时它会失败?

    1 回复  |  直到 8 年前
        1
  •  6
  •   Barry    8 年前

    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)) {}
    };