3

--更新示例--

这是一些代码:

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 autoto更改const int并指定一个实际类型,一切编译都很好,但我想知道为什么自动版本不起作用,以及是否会有某种可能的代码更改来制作一个版本自动编译。

有任何想法吗?

笔记:

改变

自动未来 = async([&]{ return retInt(a); });

自动未来 = async([&] ()->int{ return retInt(a); });

产生相同的结果

4

1 回答 1

2

你有额外的[]内部 lambda 表达式,这使得嵌入式 lambda 表达式。内部 lambda 返回1但未指定外部 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); });
                    ^^^

编译的示例代码:

http://liveworkspace.org/code/X66xE $2

于 2013-01-30T05:59:40.707 回答