限制(放大器)功能的默认参数

时间:2012-11-30 22:17:01

标签: c++ visual-c++ c++11 visual-studio-2012 c++-amp

以下代码无法编译。错误消息是:

错误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时,程序编译正常。那么放大器函数的默认参数中函数调用的规则是什么?

1 个答案:

答案 0 :(得分:2)

MSDN Forum answer问题。

  

我们选择的默认参数的语义与C ++的总体前提是一致的,即程序的解析是在一个从左到右的传递中完成的(尽管该规则几乎没有例外,最明显的是成员函数) - 因此,由于在函数参数声明之后读取了限制说明符,所以位于默认参数表达式中的任何函数调用都会根据“外部”限制规范进行绑定,无论好坏。换句话说,你从头开始用cpu-restriction“active”读取程序(因为它是默认的)并切换到限制X,用于关闭相关范围的“restrict(X)”和“}”之间的所有内容。 / p>