2012-02-22 100 views
1

我最近安装了Visual Studio 11 Developer Preview。虽然与螺纹期货玩,我来解决这个设置:VS 11与std :: future - 这是一个错误吗?

#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

我有点糊涂了,现在,因为该错误在我看来极为明显,即使是一个开发人员预览。所以我的问题是:

  • 此代码是否正确根据C++ 11标准?
  • 这个bug是否已知/报告?

回答

2

请尝试以下adhoc解决方法。 (我试过在Visual Studio中11测试版)

std::future<int> f = std::async(std::launch::any, foo, 5, 7); 

由于C++ 11的标准功能的std ::异步()有两个重载,但MSVC/CRT不能做正确的重载。此外std::launch::any不是标准的一部分。 (它需要std::launch::async|std::launch::deferred,但它们不能再编译)

+0

我发现错误报告:http://connect.microsoft.com/VisualStudio/feedback/details/729760/std-async-fails-compilation-for-callable-with-two-or-more-arguments – yohjp 2012-03-15 04:08:45

3

std::future应该是一个可变模板。这就是允许您将任意数量的参数传递给异步调用的函数。

不幸的是,VS 11的当前预览不支持可变参数模板,这意味着它没有机制让您向该函数传递多个参数。

底线:VS是错误的。我不确定是否有人将此报告为错误,但这是一个众所周知的事实的直接后果,因此,报告它可能不会做很多好事,除了间接地添加投票该可变模板很重要。

如果你看VC++ News page,他们(当前)有一个调查的链接,它应该允许你指定为了符合各种C++ 11功能而指定的优先级。不幸的是,至少目前它似乎处于离线状态。如果可以的话,填写它以表明你认为可变参数模板是一个高优先级,至少有一些机会可以做到这一点(虽然我显然不能保证任何事情)。

+0

谢谢。图书馆的实施者通常会讨论缺乏可变模板的问题,因此仍然可以使用多达8个参数。我只是想知道为什么他们没有为std :: async这么做。 – cooky451 2012-02-22 05:47:54

+3

明显的解决方法:使用lambda:'std :: async([&] {foo(5,7);})'。可能是VS车队没有在这方面付出很多努力的主要原因之一。 – Xeo 2012-03-15 03:27:48