value class

C++のクラスは、= や実体による引数の受け渡しによってコピーできます。ref classで定義されたクラスはoperator= や コピーコンストラクタをもたない場合勝手にコピーされることはありません。

ref class C {
    int i;
};
void func(C c) {}
int main()
{
    C c;
    C d;
    func(c);   // エラー
    d = c;     // エラー
}

キーワード value classで定義されたクラスは、コピーすることができ、そのコピーはビットワイズ、すなわちmemcpyのようなコピーです。

よって、value classにはこのようなコピーが可能な型しか含むことができません。すなわちref classで定義されたクラスのインスタンスを含むことはできません。

またvalue classはスタック上に作成することができます。ref classの場合はスタック上に作成したように見えても、実際はマネージヒープ上に作成されましたが、value classは本当にスタック上に作られます。

このような理由からも、value classにはref classのインスタンスを含むことができません。

また、value classは以下のものを持つことはできません。

その他、継承もできません。(interfaceを除く)