Why a lambda that captured unique_ptr cannot be used in container

214 views Asked by At

Why is it not possible to push a lamda that captured a unique_ptr into a container of std::function? Is this correct standard behavior or a VC problem? Is there a way to work around this?

#include <memory>
#include <functional>
#include <vector>

using namespace std;

int main()
{
  unique_ptr<int> up{ new int{} };
  vector<function<void()>> cont;
  cont.push_back([up_{ move(up) }]() {});  // Error here
  return 0;
}

VC Compiler Error (Visual Studio v15.8.9):

c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1195): error C2280: 'main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>::<lambda_4c17d669ccc0e2d463a7085245c40bfc>(const main::<lambda_4c17d669ccc0e2d463a7085245c40bfc> &)': attempting to reference a deleted function
non-cpy-lambda.cpp(11): note: see declaration of 'main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>::<lambda_4c17d669ccc0e2d463a7085245c40bfc>'
non-cpy-lambda.cpp(11): note: 'main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>::<lambda_4c17d669ccc0e2d463a7085245c40bfc>(const main::<lambda_4c17d669ccc0e2d463a7085245c40bfc> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'std::unique_ptr<int,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)'
        with
        [
            _Ty=int
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\memory(2337): note: 'std::unique_ptr<int,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': function was explicitly deleted
        with
        [
            _Ty=int
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1213): note: see reference to function template instantiation 'std::_Func_impl_no_alloc<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,_Ret>::_Func_impl_no_alloc<const _Callable&,void>(_Other)' being compiled
        with
        [
            _Ret=void,
            _Callable=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,
            _Other=const main::<lambda_4c17d669ccc0e2d463a7085245c40bfc> &
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1214): note: see reference to function template instantiation 'std::_Func_impl_no_alloc<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,_Ret>::_Func_impl_no_alloc<const _Callable&,void>(_Other)' being compiled
        with
        [
            _Ret=void,
            _Callable=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,
            _Other=const main::<lambda_4c17d669ccc0e2d463a7085245c40bfc> &
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1213): note: while compiling class template member function 'std::_Func_base<_Ret> *std::_Func_impl_no_alloc<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,_Ret>::_Clone(void *,std::false_type) const'
        with
        [
            _Ret=void
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1204): note: see reference to function template instantiation 'std::_Func_base<_Ret> *std::_Func_impl_no_alloc<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,_Ret>::_Clone(void *,std::false_type) const' being compiled
        with
        [
            _Ret=void
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1061): note: see reference to class template instantiation 'std::_Func_impl_no_alloc<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,_Ret>' being compiled
        with
        [
            _Ret=void
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1313): note: see reference to class template instantiation 'std::_Is_large<_Impl>' being compiled
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1502): note: see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>>(_Fx &&)' being compiled
        with
        [
            _Ret=void,
            _Fx=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>
        ]
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.15.26726\include\functional(1502): note: see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>>(_Fx &&)' being compiled
        with
        [
            _Ret=void,
            _Fx=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>
        ]
non-cpy-lambda.cpp(11): note: see reference to function template instantiation 'std::function<void (void)>::function<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,void>(_Fx)' being compiled
        with
        [
            _Fx=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>
        ]
non-cpy-lambda.cpp(11): note: see reference to function template instantiation 'std::function<void (void)>::function<main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>,void>(_Fx)' being compiled
        with
        [
            _Fx=main::<lambda_4c17d669ccc0e2d463a7085245c40bfc>
        ]
0

There are 0 answers