fnbox

The tracking issue for this feature is #28796


This had been a temporary alternative to the following impls:

impl<A, F> FnOnce for Box<F> where F: FnOnce<A> + ?Sized {}
impl<A, F> FnMut for Box<F> where F: FnMut<A> + ?Sized {}
impl<A, F> Fn for Box<F> where F: Fn<A> + ?Sized {}

The impls are parallel to these (relatively old) impls:

impl<A, F> FnOnce for &mut F where F: FnMut<A> + ?Sized {}
impl<A, F> FnMut for &mut F where F: FnMut<A> + ?Sized {}
impl<A, F> Fn for &mut F where F: Fn<A> + ?Sized {}
impl<A, F> FnOnce for &F where F: Fn<A> + ?Sized {}
impl<A, F> FnMut for &F where F: Fn<A> + ?Sized {}
impl<A, F> Fn for &F where F: Fn<A> + ?Sized {}

Before the introduction of unsized_locals, we had been unable to provide the former impls. That means, unlike &dyn Fn() or &mut dyn FnMut() we could not use Box<dyn FnOnce()> at that time.

FnBox() is an alternative approach to Box<dyn FnBox()> is delegated to FnBox::call_box which doesn't need unsized locals. As we now have Box<dyn FnOnce()> working, the fnbox feature is going to be removed.