literal (C++/CLI)

Zmienna (składowa danych) oznaczona jako literal w /clr kompilacji jest stałą czasu kompilacji. Jest to natywny odpowiednik zmiennej C# const .

Wszystkie platformy

Uwagi

(Nie ma żadnych uwag dotyczących tej funkcji językowej, która ma zastosowanie do wszystkich środowisk uruchomieniowych).

Środowisko wykonawcze systemu Windows

Uwagi

(Nie ma żadnych uwag dotyczących tej funkcji językowej, które mają zastosowanie tylko do środowisko wykonawcze systemu Windows).

środowiska uruchomieniowe w trakcie wykonania

Uwagi

Element członkowski danych oznaczony jako literal musi zostać zainicjowany po zadeklarowaniu. Wartość musi być stałym typem całkowitym, wyliczeniowym lub ciągowym. Konwersja z typu wyrażenia inicjalizacji na typ literal elementu członkowskiego danych nie może wymagać konwersji zdefiniowanej przez użytkownika.

Żadna pamięć nie jest przydzielana dla literal pola w czasie wykonywania; kompilator wstawia tylko jego wartość w metadanych klasy. Wartość literal jest traktowana jako stała czasu kompilacji. Najbliższy odpowiednik standardowego języka C++ to constexpr, ale element członkowski danych nie może znajdować się constexpr w języku C++/cli.

Zmienna oznaczona jako literal różni się od jednej oznaczonej .static const Element static const członkowski danych nie jest udostępniany w metadanych innym kompilatorom. Aby uzyskać więcej informacji, zobacz tematy static oraz const.

literal jest kontekstowym słowem kluczowym. Aby uzyskać więcej informacji, zobacz Kontekstowe słowa kluczowe.

Przykłady

W tym przykładzie pokazano, że zmienna literal oznacza staticwartość .

// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
   literal int i = 4;
};

int main() {
   int value = X::i;
}

Poniższy przykład przedstawia efekt literal w metadanych:

// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
   literal int lit = 0;
   static const int sc = 1;
};

Zwróć uwagę na różnicę w metadanych i sclit: modopt dyrektywa jest stosowana do scmetody , co oznacza, że można ją zignorować przez inne kompilatory.

.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)

Poniższy przykład, utworzony w języku C#, odwołuje się do metadanych utworzonych w poprzednim przykładzie i pokazuje efekt literal zmiennych i static const :

// mcppv2_literal3.cs
// compile with: /reference:mcppv2_literal2.dll
// A C# program
class B {
   public static void Main() {
      // OK
      System.Console.WriteLine(A.lit);
      System.Console.WriteLine(A.sc);

      // C# does not enforce C++ const
      A.sc = 9;
      System.Console.WriteLine(A.sc);

      // C# enforces const for a literal
      A.lit = 9;   // CS0131

      // you can assign a C++ literal variable to a C# const variable
      const int i = A.lit;
      System.Console.WriteLine(i);

      // but you cannot assign a C++ static const variable
      // to a C# const variable
      const int j = A.sc;   // CS0133
      System.Console.WriteLine(j);
   }
}

Wymagania

Opcja kompilatora: /clr

Zobacz też

Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows