Summary:
This code compiles and is causing stack overflow at runtime:
```
using F = folly::Function<void()>;
void foo(F);
F bar;
auto baz = [bar = std::move(bar)] {
foo(std::move(bar));
};
baz();
```
The bug there is that `baz` is missing `mutable` keyword, so when
constructing argument for `foo`, `F(const F&&)` is called, which is selecting
`template <typename Fun> F(Fun&&)` (where `Fun = F const`) and we end up in
an infinite `F<Fun>(Fun&&) <-> F<Fun>(Fun&&, SmallTag|HeapTag)` cycle.
This diff transforms this easy-to-make-bug into compile-time error.
Reviewed By: yfeldblum
Differential Revision:
D3810269
fbshipit-source-id:
f80a18ab02bd0715d692cf67c3c8943f557c2982
// (i.e., `template <typename Fun> Function(Fun&&)`).
Function(Function&) = delete;
Function(const Function&) = delete;
+ Function(const Function&&) = delete;
/**
* Move constructor