literal
(C++/CLI)
Una variable (miembro de datos) marcada como literal
en una /clr
compilación es una constante en tiempo de compilación. Es el equivalente nativo de una variable de C# const
.
Todas las plataformas
Comentarios
(No hay notas para esta característica de lenguaje que se apliquen a todos los runtimes).
Windows en tiempo de ejecución
Comentarios
(No hay notas para esta característica de lenguaje que solo se apliquen a Windows Runtime).
Common Language Runtime
Comentarios
Un miembro de datos marcado como literal
debe inicializarse cuando se declara. Además, el valor debe ser una constante integral, enumeración o tipo de cadena. La conversión del tipo de la expresión de inicialización al tipo del miembro de datos literal
no debe requerir una conversión definida por el usuario.
No se asigna memoria para el campo literal
en tiempo de ejecución; el compilador solo inserta su valor en los metadatos para la clase. El literal
valor se trata como una constante en tiempo de compilación. El equivalente más cercano en C++ estándar es constexpr
, pero un miembro de datos no puede estar constexpr
en C++/CLI.
Una variable marcada como literal
difiere de una marcada como static const
. Un miembro de datos static const
no está disponible en metadatos para otros compiladores. Para obtener más información, vea static
y const
.
literal
es una palabra clave contextual. Para obtener más información, consulte Palabras clave contextuales.
Ejemplos
En este ejemplo se muestra que una variable literal
implicastatic
.
// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
literal int i = 4;
};
int main() {
int value = X::i;
}
En el ejemplo siguiente se muestra el efecto de literal
en los metadatos:
// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
literal int lit = 0;
static const int sc = 1;
};
Tenga en cuenta la diferencia en los metadatos para sc
y lit
: la directiva modopt
se aplica a sc
, por lo que otros compiladores pueden hacerle caso omiso.
.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)
En el siguiente ejemplo, creado en C#, se hace referencia a los metadatos creados en el ejemplo anterior y se muestra el efecto de las variables literal
y 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);
}
}
Requisitos
Opción del compilador: /clr