5

次のコードはコンパイルに失敗します。エラーメッセージは次のとおりです。

エラー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)onを削除し、ラムダ内のfoo()の呼び出しを、たとえば、に置き換えると、プログラムは正常にコンパイルされます。では、amp関数のデフォルト引数での関数呼び出しのルールは何ですか?f1()5

4

1 に答える 1

2

質問に対するMSDNフォーラムの回答。

私たちが選択したデフォルトの引数のセマンティクスは、プログラムの解析が1つの左から右へのパスで行われるというC ++の包括的な前提に沿っています(このルールのいくつかの重要な例外、特にメンバー関数にもかかわらず)-したがって、制限指定子は、関数パラメーター宣言の後に読み取られます。デフォルトの引数式にある関数呼び出しは、良くも悪くも、「外部」制限仕様に従ってバインドされます。つまり、cpu-restrictionが「active」(デフォルトであるため)でプログラムを最初から読み、「restrict(X)」と「}」の間のすべてについて制限Xに切り替えて、関連するスコープを閉じます。

于 2012-12-02T01:29:12.837 に答える