0

此代码无法编译。我在指示的点上得到“预期的 { 或 ”。(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 构造函数:与任何其他类类型一样,union如果您不想单独初始化它们,s 需要一个构造函数。
  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 回答