literal
(C++/CLI)
Uma variável (membro de dados) marcada como literal
em uma compilação /clr
é uma constante de tempo de compilação. Ela é o equivalente nativo de uma variável C# const
.
Todas as plataformas
Comentários
(Não há comentários para esse recurso de linguagem que se apliquem a todos os runtimes.)
Windows Runtime
Comentários
(Não há comentários para esse recurso de linguagem que se apliquem somente ao Windows Runtime.)
Common Language Runtime
Comentários
Um membro de dados marcado como literal
deve ser inicializado ao ser declarado. E o valor deve ser do tipo constante, integral, enumeração ou cadeia de caracteres. A conversão do tipo da expressão de inicialização para o tipo do membro de dados literal
não deve exigir uma conversão definida pelo usuário.
Nenhuma memória é alocada para o campo literal
no runtime. O compilador só insere o próprio valor nos metadados da classe. O valor literal
é tratado como uma constante de tempo de compilação. O equivalente mais próximo no C++ Padrão é constexpr
, mas um membro de dados não pode ser constexpr
no C++/CLI.
Uma variável marcada como literal
é diferente de uma marcada como static const
. Um membro de dados static const
não é disponibilizado em metadados para outros compiladores. Para obter mais informações, consulte static
e const
.
literal
é uma palavra-chave contextual. Saiba mais em Palavras-chave contextuais.
Exemplos
Este exemplo mostra que uma variável literal
implica static
.
// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
literal int i = 4;
};
int main() {
int value = X::i;
}
O exemplo a seguir mostra o efeito de literal
nos metadados:
// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
literal int lit = 0;
static const int sc = 1;
};
Observe a diferença nos metadados para sc
e lit
: a diretiva modopt
é aplicada a sc
, o que significa que pode ser ignorada por outros compiladores.
.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)
O exemplo a seguir, criado em C#, faz referência aos metadados criados na amostra anterior e mostra o efeito das variáveis literal
e 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
Opção do compilador: /clr