Tôi cố gắng để di chuyển một std::packaged_task
thành một std::vector
của std::function<void()>
, vì std::packaged_task
đã void operator()(ArgTypes... args)
quá tải, nó phải là convertable để std::function<void()>
, đúng không?std :: chức năng và std :: packaged_task chuyển đổi
Điều này không biên dịch cả trên MSVC và Clang, MSVC phàn nàn về không thể chuyển đổi void thành int, clang than phiền bản sao đã xóa cho std::packaged_task
, không được di chuyển phiên bản std::vector::push_back
được gọi ở đây? những gì đang xảy ra, đây có phải là lỗi không?
int main()
{
std::vector<std::function<void()>> vec;
std::packaged_task<int()> task([] { return 100; });
vec.push_back(std::move(task));
}
Dưới đây là những thông điệp mẫu báo lỗi khó hiểu cho vang
In file included from main.cpp:1:
In file included from /usr/bin/../lib/c++/v1/iostream:38:
In file included from /usr/bin/../lib/c++/v1/ios:216:
In file included from /usr/bin/../lib/c++/v1/__locale:15:
In file included from /usr/bin/../lib/c++/v1/string:434:
In file included from /usr/bin/../lib/c++/v1/algorithm:594:
/usr/bin/../lib/c++/v1/memory:2236:15: error: call to deleted constructor of
'std::__1::packaged_task<int()>'
__first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...)
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/c++/v1/memory:2414:15: note: in instantiation of function
template specialization
'std::__1::__libcpp_compressed_pair_imp<std::__1::packaged_task<int()>,
std::__1::allocator<std::__1::packaged_task<int()> >,
2>::__libcpp_compressed_pair_imp<const std::__1::packaged_task<int()> &,
const std::__1::allocator<std::__1::packaged_task<int()> > &, 0, 0>'
requested here
: base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args),
^
/usr/bin/../lib/c++/v1/functional:996:11: note: in instantiation of function
template specialization
'std::__1::__compressed_pair<std::__1::packaged_task<int()>,
std::__1::allocator<std::__1::packaged_task<int()> >
>::__compressed_pair<const std::__1::packaged_task<int()> &, const
std::__1::allocator<std::__1::packaged_task<int()> > &>' requested here
: __f_(piecewise_construct, _VSTD::forward_as_tuple(__f),
^
/usr/bin/../lib/c++/v1/functional:1035:17: note: in instantiation of member
function 'std::__1::__function::__func<std::__1::packaged_task<int()>,
std::__1::allocator<std::__1::packaged_task<int()> >, void()>::__func'
requested here
::new (__p) __func(__f_.first(), __f_.second());
^
/usr/bin/../lib/c++/v1/functional:1277:26: note: in instantiation of member
function 'std::__1::__function::__func<std::__1::packaged_task<int()>,
std::__1::allocator<std::__1::packaged_task<int()> >, void()>::__clone'
requested here
::new (__f_) _FF(_VSTD::move(__f));
^
/usr/bin/../lib/c++/v1/memory:1681:31: note: in instantiation of function
template specialization 'std::__1::function<void
()>::function<std::__1::packaged_task<int()> >' requested here
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^
/usr/bin/../lib/c++/v1/memory:1608:18: note: in instantiation of function
template specialization 'std::__1::allocator<std::__1::function<void()>
>::construct<std::__1::function<void()>, std::__1::packaged_task<int()>
>' requested here
{__a.construct(__p, _VSTD::forward<_Args>(__args)...);}
^
/usr/bin/../lib/c++/v1/memory:1492:14: note: in instantiation of function
template specialization
'std::__1::allocator_traits<std::__1::allocator<std::__1::function<void
()> > >::__construct<std::__1::function<void()>,
std::__1::packaged_task<int()> >' requested here
{__construct(__has_construct<allocator_type, pointer, _Args...>(),
^
/usr/bin/../lib/c++/v1/vector:1519:25: note: in instantiation of function
template specialization
'std::__1::allocator_traits<std::__1::allocator<std::__1::function<void
()> > >::construct<std::__1::function<void()>,
std::__1::packaged_task<int()> >' requested here
__alloc_traits::construct(this->__alloc(),
^
main.cpp:19:6: note: in instantiation of function template specialization
'std::__1::vector<std::__1::function<void()>,
std::__1::allocator<std::__1::function<void()> >
>::emplace_back<std::__1::packaged_task<int()> >' requested here
vec.emplace_back(std::move(task));
^
/usr/bin/../lib/c++/v1/future:1956:5: note: function has been explicitly marked
deleted here
packaged_task(const packaged_task&) = delete;
^
2 errors generated.
thể bạn vui lòng cung cấp các thông báo lỗi chính xác? –
Và đó chỉ là hai lỗi. –
'std :: packaged_task 'là chỉ di chuyển. 'std :: function ' chỉ hoạt động với các functors có thể sao chép được (và tương thích với 'Sig'). –