Static Const Int Linkage Is No Longer Literal

Declaration of a constant member of a class has changed from Managed Extensions for C++ to Visual C++.

Although static const integral members are still supported, their linkage attribute has changed. Their former linkage attribute is now carried in a literal integral member. For example, consider the following Managed Extensions class:

public __gc class Constants {
public:
   static const int LOG_DEBUG = 4;
};

This generates the following underlying CIL attributes for the field (note the literal attribute):

.field public static literal int32 
modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) STANDARD_CLIENT_PRX = int32(0x00000004)

While this still compiles under the new syntax:

public ref class Constants {
public:
   static const int LOG_DEBUG = 4;
};

it no longer emits the literal attribute, and therefore is not viewed as a constant by the CLR runtime:

.field public static int32 modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) STANDARD_CLIENT_PRX = int32(0x00000004)

In order to have the same inter-language literal attribute, the declaration should be changed to the newly supported literal data member, as follows,

public ref class Constants {
public:
   literal int LOG_DEBUG = 4;
};

See Also

Reference

literal (Visual C++)

Concepts

Member Declarations within a Class or Interface