2

我可以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;};

但收到编译错误。

感谢您的关注!

4

1 回答 1

5

lambda 表达式的结果是一个闭包对象,而闭包对象的类型是不可知的。您只能用于auto声明其确切类型的变量。

但是,您可以闭包对象转换为合适的 an 实例std::function,如果 lambda 是非捕获的,您甚至可以将其转换为函数指针。但是,这种转换可能会带来(巨大的)成本,因此您应该auto尽可能多地使用来处理实际的闭包类型。

bind表达式也是如此。

相关标准部分为 5.1.2(3):

lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型——称为闭包类型——其属性如下所述。此类类型不是聚合。

也就是说,我不确定特殊的 AMP 扩展在这种情况下的表现如何,并且可以想象,受 AMP 限制的 lambda不能转换为其他任何东西。我会尝试在 AMP 规范中查找这一点。

更新:AMP 规范的第 2.2.3 和 2.3 节似乎适用于这个问题。

于 2012-05-07T10:28:23.413 回答