Compartilhar via


Erro do compilador C3899

'var': o uso l-value do membro de dados initonly não é permitido diretamente dentro de uma região paralela na classe 'class'

Um membro de dados initonly (C++/CLI) não pode ser inicializado dentro dessa parte de um construtor que está em uma região paralela. Isso ocorre porque o compilador faz uma realocação interna desse código, de modo que ele não faz mais parte do construtor.

Para resolver, inicialize o membro de dados initonly no construtor, mas fora da região paralela.

Exemplo

O exemplo a seguir gera o erro 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);
}