This topic applies only to version 1 of Managed Extensions for C++. This syntax should only be used to maintain version 1 code. See Classes and Structs (C++ Component Extensions) for information on using the equivalent functionality in the new syntax.

Declares a class to be a __value type.


__value struct-specifier
__nogc array-specifier
__nogc pointer-specifier


A __value type differs from __gc types in that __value type variables directly contain their data, whereas managed variables point to their data, which is stored on the common language runtime heap.

The following conditions apply to __value types:

  • The __value keyword cannot be applied to an interface.

  • A __value type can inherit from any number of interfaces and cannot inherit from other types or __value types.

  • A __value type is sealed by definition. For more information, see __sealed.

  • It is valid to use a __value type anywhere a managed type is allowed.


The __value keyword is not allowed when used with the __abstract keyword.

A __value type can be explicitly connected to a System::Object pointer. This is known as boxing.

The following guidelines apply to embedding a value type inside a __nogc type:

  • The value type must have LayoutSequential or LayoutExplicit.

  • The value type can not have gc pointer members.

  • The value type can not have private data members.

In Managed Extensions for C++, the equivalents to a C# class and a C# struct are as follows:

Managed Extensions for C++


For more information

__gc struct


__gc class


class keyword

__value struct


__value class


struct keyword


In the following example, a __value type (V) is declared and then two instances of the __value type are manipulated:

// keyword__value.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>

__value struct V { 
   int m_i;

int main() {
   V v1, v2;
   v1.m_i = 5;
   v2 = v1;   // copies all fields of v1 to v2
   v2.m_i = 6;   // does not affect v1.m_I