literal
(C++/CLI)
Переменная (член данных), помеченная как literal
в /clr
компиляции, является константой во время компиляции. Это собственный эквивалент переменной C# const
.
Все платформы
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется во всех средах выполнения.)
Среда выполнения Windows
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется только в среде выполнения Windows).
Среда CLR
Замечания
Элемент данных, помеченный как literal
должен быть инициализирован при объявлении. И значение должно быть константным целочисленным, перечислением или строковым типом. Преобразование из типа выражения инициализации в тип literal
члена данных не может требовать пользовательского преобразования.
Память не выделяется для literal
поля во время выполнения. Компилятор только вставляет его значение в метаданные класса. Значение literal
рассматривается как константой времени компиляции. Ближайшим эквивалентом в C++ constexpr
является стандартный, но член данных не может находиться constexpr
в C++/CLI.
Переменная, помеченная как literal
отличается от одной помеченной static const
. Элемент static const
данных недоступен в метаданных другим компиляторам. Дополнительные сведения см. в разделах static
и const
.
literal
— контекстно-зависимое ключевое слово. Дополнительные сведения см. в разделе "Ключевые слова с учетом контекста".
Примеры
В этом примере показано, что literal
переменная подразумевает static
.
// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
literal int i = 4;
};
int main() {
int value = X::i;
}
В следующем примере показан эффект literal
в метаданных:
// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
literal int lit = 0;
static const int sc = 1;
};
Обратите внимание на разницу в метаданных для sc
и lit
: директива modopt
применяется к sc
и поэтому она может игнорироваться другими компиляторами.
.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)
Следующий пример, созданный в C#, ссылается на метаданные, созданные в предыдущем примере, и показывает эффект literal
и 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);
}
}
Требования
Параметр компилятора: /clr