我最近安装了Visual Studio 11开发人员预览版。在玩线程和期货时,我遇到了这个设置:
#include <future>
#include <iostream>
int foo(unsigned a, unsigned b)
{
return 5;
}
int main()
{
std::future<int> f = std::async(foo, 5, 7);
std::cout << f.get();
}
所以,非常简单。但由于“foo”有两个参数,VS 11不想编译它。 (但是,g ++会:http://ideone.com/ANrPj)(运行时错误没问题:std::future exception on gcc experimental implementation of C++0x)(VS 11 errormessage:http://pastebin.com/F9Xunh2s)
我现在有点困惑,因为这个错误对我来说非常明显,即使它是开发者预览版。所以我的问题是:
答案 0 :(得分:3)
std::future
应该是一个可变参数模板。这允许您将任意数量的参数传递给异步调用的函数。
不幸的是,VS 11的当前预览版不支持可变参数模板,这意味着它没有将多个参数传递给函数的机制。
底线:VS错了。我不确定是否有人报告这是一个错误,但这是一个已经众所周知的事实的直接结果,所以报告它可能不会/不会做很多好事,除了间接添加投票可变参数模板很重要。
如果您查看VC++ News page,他们(当前)会有一个指向调查的链接,该调查应该允许您指定您为了符合各种C ++ 11功能而指定的优先级。不幸的是,它似乎离线了,至少目前是这样。如果可以的话,填写它以表明您认为可变参数模板具有高优先级至少有一些机会为此做一些好处(尽管我显然不能保证任何东西)。
答案 1 :(得分:2)
尝试以下adhoc解决方法。 (我试过Visual Studio 11 Beta)
std::future<int> f = std::async(std::launch::any, foo, 5, 7);
由于C ++ 11标准函数std :: async()有两个重载,但MSVC / CRT无法做到正确的重载解析。此外std::launch::any
不是标准的一部分。 (它需要std::launch::async|std::launch::deferred
,但它们无法再次编译)