Kompilatorfel C3899

"'var': l-value-användning av initonly-datamedlem är inte tillåten direkt inom en parallell region i klassen 'klass'"

Anmärkningar

Det går inte att initiera en initonly-datamedlem (C++/CLI) i den delen av en konstruktor som befinner sig i en parallell region. Detta beror på att kompilatorn gör en intern omlokalisering av koden, så att den i praktiken inte längre är en del av konstruktorn.

För att lösa problemet, initiera initonly-datamedlemmen i konstruktorn, men utanför det parallella området.

Example

I följande exempel genereras C3899.

// C3899.cpp
// compile with: /clr /openmp
#include <omp.h>

public ref struct R {
   initonly int x;
   R() {
      x = omp_get_thread_num() + 1000;   // OK
      #pragma omp parallel num_threads(5)
      {
         // cannot assign to 'x' here
         x = omp_get_thread_num() + 1000;   // C3899
         System::Console::WriteLine("thread {0}", omp_get_thread_num());
      }
      x = omp_get_thread_num() + 1000;   // OK
   }
};

int main() {
   R^ r = gcnew R;
   System::Console::WriteLine(r->x);
}