来自http://www.cplusplus.com的std :: packaged_task :: reset示例不起作用

时间:2014-05-04 09:23:17

标签: c++ macos gcc c++11 clang

我尝试编译并运行http://www.cplusplus.com/reference/future/packaged_task/reset/中的reset()函数示例:

$ cat task.cpp
// packaged_task::get_future
#include <iostream>     // std::cout
#include <utility>      // std::move
#include <future>       // std::packaged_task, std::future
#include <thread>       // std::thread

// a simple task:
int triple (int x) { return x*3; }

int main ()
{
  std::packaged_task<int(int)> tsk (triple); // package task

  std::future<int> fut = tsk.get_future();
  std::thread (std::move(tsk),33).detach();
  std::cout << "The triple of 33 is " << fut.get() << ".\n";

  // re-use same task object:
  tsk.reset();
  fut = tsk.get_future();
  std::thread(std::move(tsk),99).detach();
  std::cout << "Thre triple of 99 is " << fut.get() << ".\n";

  return 0;
}

但是我遇到编译器错误或运行时错误,具体取决于使用的编译器:

  • GCC

$ g++ -o task -std=c++11 -I/opt/local/include task.cpp && ./task The triple of 33 is 99. terminate called after throwing an instance of 'std::future_error' what(): No associated state [1] 14850 abort ./task

  • CLANG:

$ clang++ -o task -std=c++11 -stdlib=libc++ -I/opt/local/include task.cpp && ./task In file included from task.cpp:2: In file included from /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/iostream:38: In file included from /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/ios:216: In file included from /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/__locale:15: In file included from /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/string:439: In file included from /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/algorithm:627: /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:1627:45: error: multiple overloads of 'address' instantiate to the same signature 'const_pointer (const_reference) const noexcept' _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/type_traits:922:38: note: in instantiation of template class 'std::__1::allocator<int (int)>' requested here : public integral_constant<bool, __is_empty(_Tp)> {}; ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:1908:40: note: in instantiation of template class 'std::__1::is_empty<std::__1::allocator<int (int)> >' requested here bool = is_empty<_T2>::value ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:1930:44: note: in instantiation of default argument for '__libcpp_compressed_pair_switch<int (int), std::__1::allocator<int (int)>, false, false>' required here template <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:2298:15: note: in instantiation of default argument for '__libcpp_compressed_pair_imp<int (int), std::__1::allocator<int (int)> >' required here : private __libcpp_compressed_pair_imp<_T1, _T2> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:1770:36: note: in instantiation of template class 'std::__1::__compressed_pair<int (int), std::__1::allocator<int (int)> >' requested here __compressed_pair<_Fp, _Alloc> __f_; ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:1877:9: note: in instantiation of template class 'std::__1::__packaged_task_func<int (int), std::__1::allocator<int (int)>, int (int)>' requested here if (sizeof(_FF) <= sizeof(__buf_)) ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:2026:45: note: in instantiation of function template specialization 'std::__1::__packaged_task_function<int (int)>::__packaged_task_function<int (&)(int)>' requested here explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} ^ task.cpp:12:32: note: in instantiation of function template specialization 'std::__1::packaged_task<int (int)>::packaged_task<int (&)(int), void>' requested here std::packaged_task<int(int)> tsk (triple); // package task ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:1625:39: note: previous declaration is here _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:2121:9: error: data member instantiated with function type 'int (int)' _T1 __first_; ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/memory:2298:15: note: in instantiation of template class 'std::__1::__libcpp_compressed_pair_imp<int (int), std::__1::allocator<int (int)>, 2>' requested here : private __libcpp_compressed_pair_imp<_T1, _T2> ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:1770:36: note: in instantiation of template class 'std::__1::__compressed_pair<int (int), std::__1::allocator<int (int)> >' requested here __compressed_pair<_Fp, _Alloc> __f_; ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:1877:9: note: in instantiation of template class 'std::__1::__packaged_task_func<int (int), std::__1::allocator<int (int)>, int (int)>' requested here if (sizeof(_FF) <= sizeof(__buf_)) ^ /opt/local/libexec/llvm-3.4/bin/../include/c++/v1/future:2026:45: note: in instantiation of function template specialization 'std::__1::__packaged_task_function<int (int)>::__packaged_task_function<int (&)(int)>' requested here explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} ^ task.cpp:12:32: note: in instantiation of function template specialization 'std::__1::packaged_task<int (int)>::packaged_task<int (&)(int), void>' requested here std::packaged_task<int(int)> tsk (triple); // package task ^ 2 errors generated.

我正在使用OSX Maverics和编译器:

$ g++ --version g++ (MacPorts gcc48 4.8.2_0) 4.8.2

$ clang++ --version clang version 3.4 (tags/RELEASE_34/final) Target: x86_64-apple-darwin13.1.0 Thread model: posix

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

GCC是正确的:

std::thread (std::move(tsk),33).detach(); // 1
//...
tsk.reset();  // 2

在(1)之后,tsk没有更多状态(每packaged_taskmove constructor

在(2),reset()required to throw no_state std::future_error

正如评论中所指出的,

clang有一个错误。