literal
(C++/CLI)
Une variable (membre de données) marquée comme literal
dans une /clr
compilation est une constante au moment de la compilation. Il s’agit de l’équivalent natif d’une variable C# const
.
Toutes les plateformes
Notes
(Aucune remarque pour cette fonctionnalité de langage ne s’applique à tous les runtimes.)
Windows Runtime
Notes
(Aucune note de cette fonctionnalité de langage ne s’applique qu’au Windows Runtime.)
Common Language Runtime
Notes
Un membre de données marqué comme literal
doit être initialisé lorsqu’il est déclaré. Et la valeur doit être un type intégral, enum ou chaîne constant. La conversion du type de l’expression d’initialisation vers le type du membre de données ne peut pas nécessiter une conversion définie par l’utilisateur literal
.
Aucune mémoire n’est allouée au champ au moment de l’exécution literal
; le compilateur insère uniquement sa valeur dans les métadonnées de la classe. La literal
valeur est traitée comme une constante au moment de la compilation. L’équivalent le plus proche en C++ standard est constexpr
, mais un membre de données ne peut pas être constexpr
en C++/CLI.
Une variable marquée comme différente literal
d’une variable marquée static const
. Un static const
membre de données n’est pas disponible dans les métadonnées pour d’autres compilateurs. Pour plus d’informations, consultez static
et const
.
literal
est un mot clé contextuel. Pour plus d’informations, consultez mots clés sensibles au contexte.
Exemples
Cet exemple montre qu’une literal
variable implique static
.
// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
literal int i = 4;
};
int main() {
int value = X::i;
}
L’exemple suivant montre l’effet des literal
métadonnées :
// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
literal int lit = 0;
static const int sc = 1;
};
Notez la différence entre sc
et lit
dans les métadonnées : la directive modopt
est appliquée à sc
, ce qui signifie qu’elle peut être ignorée par d’autres compilateurs.
.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)
L’exemple suivant, créé en C#, fait référence aux métadonnées créées dans l’exemple précédent et affiche l’effet des variables et static const
des literal
variables :
// 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);
}
}
Spécifications
Option du compilateur : /clr