나는 std::packaged_task
를 이동하는 것을 시도하고, std::packaged_task
이 void operator()(ArgTypes... args)
가 과부하 때문에, 그것은 예, std::function<void()>
에 convertable해야 하는가?표준 : 기능과 표준 : packaged_task 변환
이것은 MSVC와 Clang에서 컴파일되지 않습니다. MSVC는 void를 int로 변환 할 수 없다고 불평하고, clang은 std::packaged_task
의 삭제 된 복사본 생성자를 불평합니다. std::vector::push_back
의 버전을 옮기지 말아야합니까? 무슨 일이 벌어지고 있니?이게 버그 야? 여기
int main()
{
std::vector<std::function<void()>> vec;
std::packaged_task<int()> task([] { return 100; });
vec.push_back(std::move(task));
}
네, 그것은
std::function<void()>
에 convertable해야 그 소리
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.
당신은 정확한 오류 메시지를 포함시겠습니까? –
그리고 그것은 단지 두 가지 오류 때문이었습니다. –
'std :: packaged_task'은 (는) 이동 전용입니다. 'std :: function '는 복사 가능한 펑터에서만 작동하며 ('Sig'와 호환 가능합니다). –