我可以创建restrict(amp)
函数,如下所示:
auto f = [](int& item) restrict(amp) {item += 1;};
我可以在其他restrict(amp)
函数中使用此函数,例如:
concurrency::parallel_for_each(av.extent,
[=](concurrency::index<1> idx) restrict(amp)
{
f(av[idx]);
}
);
编译后用什么类型代替“auto
”?我试图使用“std :: function”:
std::function<void (int&) restrict(amp)> f
= [](int& item) restrict(amp) {item += 1;};
但收到编译错误。
感谢您的关注!
答案 0 :(得分:5)
lambda表达式的结果是一个闭包对象,闭包对象的类型是不可知的。您只能 使用auto
来声明其确切类型的变量。
但是,您可以将一个闭包对象转换为合适的std::function
实例,如果lambda是非捕获的,您甚至可以将它转换为函数指针。但是,此转换可能会产生(重大)成本,因此您应该尽可能使用auto
来处理实际的闭包类型。
bind
表达式也是如此。
相关标准部分为5.1.2(3):
lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述。此类类型不是聚合。
那就是说,我不确定特殊AMP扩展在这种情况下的表现如何,并且可以想象AMP限制的lambdas 不能可以转换为其他任何东西。我将尝试在AMP规范中查看。
更新: AMP Specification的第2.2.3和2.3节似乎适用于此问题。