Why can’t C++11 move a noncopyable functor to a std::function?

The short answer is that the C++11 specification requires your A to be CopyConstructible to be used with std::function.

The long answer is this requirement exists because std::function erases the type of your functor within the constructor. To do this, std::function must access certain members of your functor via virtual functions. These include the call operator, the copy constructor and the destructor. And since these are accessed via a virtual call, they are “used” whether or not you actually use std::function‘s copy constructor, destructor or call operator.

Leave a Comment