4

ユニオンとその有用性についてもっと学ぼうとしていたとき、次のコードが完全に有効であり、期待どおりに機能することに驚きました。

template <class T>
union Foo
{
    T a;
    float b;

    Foo(const T& value)
        : a(value)
    {
    }

    Foo(float f)
        : b(f)
    {
    }

    void bar()
    {
    }

    ~Foo()
    {
    }
};

int main(int argc, char* argv[])
{
    Foo<int> foo1(12.0f);
    Foo<int> foo2((int) 12);

    foo1.bar();
    foo2.bar();

    int s = sizeof(foo1); // s = 4, correct

    return 0;
}

これまで、テンプレート、コンストラクタ、デストラクタ、さらにはメンバー関数で共用体を宣言することが合法であることを知りませんでした。参考までに、私は Visual Studio 2012 を使用しています。

この方法でユニオンを使用する方法についてインターネットで検索したところ、何も見つかりませんでした。これは C++ の新機能ですか、それとも MSVC 固有のものですか? そうでない場合は、ユニオン、特にクラスのように使用される例 (上記) について詳しく知りたいと思います。誰かが共用体とそのデータ構造としての使用法についてのより詳細な説明を教えてくれれば、非常にありがたいです。

4

1 に答える 1

2

これは C++ の新機能ですか、それとも MSVC 固有のものですか?

いいえ、BoBtFish が言ったように、2003 C++ 標準セクションの9.5 Unions段落に1は次のように書かれています。

[...] 共用体にはメンバー関数 (コンストラクターとデストラクタを含む) を含めることができますが、仮想 (10.3) 関数を含めることはできません。共用体には基底クラスがあってはなりません。共用体は基本クラスとして使用してはなりません。非自明なコンストラクタ (12.1)、非自明なコピー コンストラクタ (12.8)、非自明なデストラクタ (12.4)、または非自明なコピー代入演算子 (13.5.3、12.8) を持つクラスのオブジェクトは、ユニオンのメンバーになることも、そのようなオブジェクトの配列にすることもできません。共用体に静的データ メンバーまたは参照型のメンバーが含まれている場合、プログラムの形式は正しくありません。

unions はセクションの下に9 Classesあり、class-key の文法は次のとおりです。

class-key:
   class
   struct
   union

のように動作しclassますが、さらに多くの制限があります。重要な制限は、unions一度に 1 つのアクティブな非静的メンバーしか持てないことです。これについては、段落でも説明してい1ます。

ユニオンでは、非静的データ メンバーの最大 1 つをいつでもアクティブにできます。つまり、非静的データ メンバーの最大 1 つの値をいつでもユニオンに格納できます。[...]

の文言C++11 draft standardは似ているので、 からあまり変わっていません2003

a の使用に関しては、この前のスレッドC/C++unionでさまざまな角度からカバーされている 2 つの一般的な理由があります。基本的には C のみの時代の名残ですか? 要約する:

へのこの回答は、 が に実装されているUnions cannot be used as Base class理由について、非常に優れた洞察を提供します。unionsC++

于 2013-08-11T03:28:11.700 に答える