История изменений
Исправление Begemoth, (текущая версия) :
Ты настролько Ъ?
Процитирую со stackoverflow
template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);
Requires: F shall be CopyConstructible. f shall be Callable for argument types ArgTypes and return type R. The copy constructor and destructor of A shall not throw exceptions.
§20.9.11.2.1 [func.wrap.func.con]
Note that operator = is defined in terms of this constructor and swap, so the same restrictions apply:
template<class F> function& operator=(F&& f);
Effects: function(std::forward<F>(f)).swap(*this);
§20.9.11.2.1 [func.wrap.func.con]
So to answer your question: Yes, it is possible to construct a std::function from a move-capturing lambda (since this only specifies how the lambda captures), but it is not possible to construct a std::function from a move-only type (e.g. a move-capturing lambda which move-captures something that is not copy constructible).
Ключевая фраза стандарта: F shall be CopyConstructible
Исходная версия Begemoth, :
Ты настролько Ъ?
Процитирую со stackoverflow
template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);
Requires: F shall be CopyConstructible. f shall be Callable for argument types ArgTypes and return type R. The copy constructor and destructor of A shall not throw exceptions.
§20.9.11.2.1 [func.wrap.func.con]
Note that operator = is defined in terms of this constructor and swap, so the same restrictions apply:
template<class F> function& operator=(F&& f);
Effects: function(std::forward<F>(f)).swap(*this);
§20.9.11.2.1 [func.wrap.func.con]
So to answer your question: Yes, it is possible to construct a std::function from a move-capturing lambda (since this only specifies how the lambda captures), but it is not possible to construct a std::function from a move-only type (e.g. a move-capturing lambda which move-captures something that is not copy constructible).