Boost.TypeErasure:可移动函子

时间:2018-07-15 03:06:24

标签: c++ lambda boost-type-erasure

由于std::function需要复制语义,并且捕获的lambda无法转换为std::function,因此我尝试使用boost.TypeErasure定义可移动函数。一切正常,直到需要移动分配运算符为止。

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/constructible.hpp>
#include <boost/type_erasure/callable.hpp>
#include <boost/type_erasure/builtin.hpp>
#include <boost/mpl/vector.hpp>

namespace bte = boost::type_erasure;
namespace bm = boost::mpl;

using Foo = bte::any<
    bm::vector<
        bte::constructible<bte::_self(bte::_self&&)>,
        bte::assignable<bte::_self, bte::_self&&>,
        bte::destructible<>,
        bte::callable<void()>
    >
>;

int main()
{
    Foo{[&]{}};
}

使用gcc,编译错误为:

In file included from /usr/local/include/boost/type_erasure/detail/normalize.hpp:34,

                 from /usr/local/include/boost/type_erasure/any.hpp:36,

                 from main.cpp:1:

/usr/local/include/boost/type_erasure/builtin.hpp: In instantiation of 'static void boost::type_erasure::assignable<T, U>::apply(T&, const U&) [with T = main()::<lambda()>; U = main()::<lambda()>&&]':

/usr/local/include/boost/type_erasure/detail/instantiate.hpp:91:9:   required from 'static void boost::type_erasure::detail::instantiate_concept4::apply(Concept*, Map*) [with Concept = boost::mpl::vector<boost::type_erasure::constructible<boost::type_erasure::_self(boost::type_erasure::_self&&)>, boost::type_erasure::assignable<boost::type_erasure::_self, boost::type_erasure::_self&&>, boost::type_erasure::destructible<>, boost::type_erasure::callable<void()> >; Map = boost::mpl::map1<boost::mpl::pair<boost::type_erasure::_self, main()::<lambda()> > >]'

/usr/local/include/boost/type_erasure/any.hpp:225:13:   required from 'boost::type_erasure::any<Concept, T>::any(U&&) [with U = main()::<lambda()>; Concept = boost::mpl::vector<boost::type_erasure::constructible<boost::type_erasure::_self(boost::type_erasure::_self&&)>, boost::type_erasure::assignable<boost::type_erasure::_self, boost::type_erasure::_self&&>, boost::type_erasure::destructible<>, boost::type_erasure::callable<void()> >; T = boost::type_erasure::_self]'

main.cpp:21:14:   required from here

/usr/local/include/boost/type_erasure/builtin.hpp:73:51: error: use of deleted function 'main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&)'

     static void apply(T& dst, const U& src) { dst = src; }

                                               ~~~~^~~~~

main.cpp:21:11: note: a lambda closure type has a deleted copy assignment operator

     Foo{[&]{}};

           ^

我不明白为什么apply的论据是const。正确的方法是什么?

Coliru link

更新

我认为lambda是可移动的。但是,这似乎是错误的。

0 个答案:

没有答案