Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Переменная (член данных), помеченная как 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