c – 可以使用模板函数std :: async

前端之家收集整理的这篇文章主要介绍了c – 可以使用模板函数std :: async前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
std::async是否喜欢使用模板功能?我试图将laugh std::reverse作为一个异步任务bu得到编译时错误.

我试图使用更简单的函数(foo和bar),并发现只有非模板功能正在运行.

  1. #include <algorithm>
  2. #include <future>
  3. #include <string>
  4.  
  5. void foo(std::string::iterator first,std::string::iterator last)
  6. {
  7. }
  8.  
  9. template<class BidirectionalIterator>
  10. void bar(BidirectionalIterator first,BidirectionalIterator last)
  11. {
  12. }
  13.  
  14. int main()
  15. {
  16. std::string str = "Lorem ipsum,dolor sit amet";
  17.  
  18. auto result_reverse = std::async(std::reverse,str.begin(),str.end()); // Compile-time error
  19. auto result_foo = std::async(foo,str.end());
  20. auto result_bar = std::async(bar,str.end()); // Compile-time error
  21.  
  22. result_reverse.get();
  23. result_foo.get();
  24. result_bar.get();
  25. }

编译错误如下:

  1. main.cpp: In function int main()’:
  2. main.cpp:18:71: erreur: no matching function for call to async(<unresolved overloaded function type>,std::basic_string<char>::iterator,std::basic_string<char>::iterator)’
  3. main.cpp:18:71: note: candidates are:
  4. /usr/include/c++/4.6/future:1355:5: note: template<class _Fn,class ... _Args> std::future<typename std::result_of<_Functor(_ArgTypes ...)>::type> std::async(std::launch,_Fn&&,_Args&& ...)
  5. /usr/include/c++/4.6/future:1378:5: note: template<class _Fn,class ... _Args> typename std::__async_sfinae_helper<typename std::decay<_Functor>::type,_Fn,_Args ...>::type std::async(_Fn&&,_Args&& ...)
  6. main.cpp:18:71: erreur: unable to deduce auto from ‘<expression error>’
  7. main.cpp:20:62: erreur: no matching function for call to async(<unresolved overloaded function type>,std::basic_string<char>::iterator)’
  8. main.cpp:20:62: note: candidates are:
  9. /usr/include/c++/4.6/future:1355:5: note: template<class _Fn,_Args&& ...)
  10. main.cpp:20:62: erreur: unable to deduce auto from ‘<expression error>’

但是,当我手动指定模板instanciation,如std :: async(std :: reverse< std :: string :: iterator> str.begin(),str.end())时,它会通过.

这是一个编译器错误(GCC 4.6.3)还是明确的行为?

解决方法

它可以,但调用有点不同:
  1. auto result_reverse = std::async([&str]() mutable {
  2. std::reverse(str.begin(),str.end());
  3. });

这是因为std :: reverse()不是一个函数,而是一个作为函数调用时变成函数函数模板.

上面的内容反转了一个字符串的副本并抛弃了结果.要通过引用传递字符串,应该将lambda表达式更改为以[& str]()开头.

猜你在找的C&C++相关文章