以下代码无法编译。错误消息是:
错误1:
error C3930: 'foo' : no overloaded function has restriction specifiers that are compatible with the ambient context ''
错误2:
error C2660: 'f1' : function does not take 0 arguments
错误3:
IntelliSense: amp-restricted function "int foo() restrict(amp)" (declared at line 5) must be called from an amp-restricted function
该计划:
#include <amp.h>
#include <iostream>
using namespace std;
int foo() restrict(amp) { return 5; }
int f1(int x = foo()) restrict(amp) {
return x;
}
int main()
{
using namespace concurrency;
int a[10] = {0};
array_view<int> av(10, a);
parallel_for_each(av.extent, [=](index<1> i) restrict(amp) {
av[i] = f1();
});
for(unsigned i=0; i<10; ++i) {
cout << av[i] << "\n";
}
return 0;
}
奇怪的是,当我删除restrict(amp)
上的foo()
,并将lambda中f1()
的调用替换为5
时,程序编译正常。那么放大器函数的默认参数中函数调用的规则是什么?
答案 0 :(得分:2)
我们选择的默认参数的语义与C ++的总体前提是一致的,即程序的解析是在一个从左到右的传递中完成的(尽管该规则几乎没有例外,最明显的是成员函数) - 因此,由于在函数参数声明之后读取了限制说明符,所以位于默认参数表达式中的任何函数调用都会根据“外部”限制规范进行绑定,无论好坏。换句话说,你从头开始用cpu-restriction“active”读取程序(因为它是默认的)并切换到限制X,用于关闭相关范围的“restrict(X)”和“}”之间的所有内容。 / p>