1

我最近安装了 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)(运行时错误没问题:C++0x 的 gcc 实验实现上的 std::future 异常)(VS 11 错误消息:http://pastebin. com/F9Xunh2s )

我现在有点困惑,因为这个错误对我来说似乎非常明显,即使它是开发人员预览版。所以我的问题是:

  • 根据 C++11 标准,这段代码是否正确?
  • 此错误是否已知/已报告?
4

2 回答 2

3

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

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

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

如果您查看VC++ 新闻页面,他们(当前)有一个调查链接,该链接应该允许您指出您为符合各种 C++11 特性而分配的优先级。不幸的是,它似乎处于离线状态,至少目前如此。如果可以的话,填写它以表明您认为可变参数模板具有高优先级至少有一些机会为此做一些好事(尽管我显然不能保证任何事情)。

于 2012-02-22T05:31:59.320 回答
2

尝试以下临时解决方法。(我在 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,但他们不能再次编译)

于 2012-03-15T02:57:18.007 回答