literal
(C++/CLI)
/clr
のコンパイルで literal
とマークされた変数 (データ メンバー) は、コンパイル時の定数となります。 これは、C# const
変数にネイティブに相当します。
すべてのプラットフォーム
解説
(この言語機能にはランタイムに適用される特記事項がありません。)
Windows ランタイム
解説
(この言語機能には Windows ランタイムのみに適用される特記事項がありません。)
共通言語ランタイム
解説
literal
としてマークされたデータ メンバーは、宣言時に初期化する必要があります。 また、値は定数整数、列挙型、または文字列型である必要があります。 初期化式の型から literal
データ メンバーの型への変換では、ユーザー定義に変換できません。
実行時に literal
フィールドにメモリは割り当てられません。コンパイラは、その値をクラスのメタデータに挿入するだけです。 literal
値は、コンパイル時の定数として扱われます。 標準 C++ で最も近いものは constexpr
ですが、C++/CLIで データ メンバーは constexpr
にできません。
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
の違いに注目してください。sc
には modopt
ディレクティブが 適用され、他のコンパイラでは無視される可能性があることを意味します。
.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