- 更新示例 -
以下是一些代码:
int retInt(int a) { return a; }
void randomFunction()
{
int a = 3;
auto future = async([&]{ return retInt(a); });
const auto ret = future.get();
}
VS2012 intellisense告诉我'ret'是const < error-type >
并且不会让我编译,给我输出消息:
[不能从'void'推断'const auto'的类型]
例如,如果我将'ret'从const auto
更改为const int
并指定实际类型,一切都编译得很好,但我想知道为什么自动版本不起作用,如果有的话是一种可能的代码更改,以使版本具有自动编译。
有什么想法吗?
注意:
更改
auto future = async([&amp;] {return retInt(a);});
到
auto future = async([&amp;]() - &gt; int {return retInt(a);});
产生相同的结果
答案 0 :(得分:2)
lambda表达式中有额外的[]
,这使得嵌入的lambda表达式。 inner lambda返回1
但未指定outter lamda返回类型,默认为void。
变化
auto afuture = async([&]{ []{ return 1; }; });
为:
auto afuture = async( []{ return 1; });
const auto ret = afuture.get();
编辑:
您的新代码在VS2012 NOV CTP和gcc 4.7.2上运行正常。
注意: 您通过引用捕获局部变量a,它对异步线程是安全的,您可能希望按值捕获它。
auto future = async([=]{ return retInt(a); });
^^^
编译的示例代码: