0

このコードはコンパイルに失敗します。示されたポイントで「Expected { or ,」が表示されます。(Xcode 5 であるため、かなり完全な C++11 コンパイラです。)

コンストラクター初期化子リストでネストされた共用体のメンバーを初期化する方法はありますか、それともコンストラクター本体でそれを行う必要がありますか?

class Foo
{
public:
    Foo(): m_bar.m_x(123) { }
private:     // ^ error here
    union
    {
        union
        {
            int m_x;
            float m_y;
        }
        m_pod;
        std::string m_name;
    };
};
4

1 に答える 1

11

これは、さまざまな問題を修正するコードの書き直されたバージョンです。

  1. ネストされたunionsa コンストラクターを提供します。他のクラス型と同様に、unions を個別に初期化したくない場合は、コンストラクターが必要です。
  2. union barそれ以外の場合は、メンバーのためにそのデストラクタがdeleted であるため、ネストされたデストラクタにデストラクタを与えstd::stringます (また、メンバーがstd::stringこのコードにはない型である可能性があるという状況に対処する必要があります)。標準の関連する条項は、12.4 [class.dtor] パラグラフ 5 です。

    クラス X のデフォルトのデストラクタは、次の場合に削除済みと定義されます。

    - X is a union-like class that has a variant member with a non-trivial destructor,
    - ...
    
  3. また、欠落しているヘッダーも含まれてい<string>ます。

これはコードです:

#include <string>
class Foo
{
public:
    Foo(): m_bar(123) { }
private:
    union bar
    {
        bar(int x): m_pod(x) {}
        bar(float y): m_pod(y) {}
        ~bar() {}
        union baz
        {
            baz(int x): m_x(x) {}
            baz(float y): m_y(y) {}
            int m_x;
            float m_y;
        }
        m_pod;
        std::string m_name;
    } m_bar;
};
于 2013-10-04T21:45:37.283 に答える