尝试使用匿名联合引用已删除的函数错误

时间:2016-07-05 19:05:57

标签: c++

struct Dingus {
union {
    int dingly[4 *4];
    vec3 dinglyDo;
}diddly;
inline Dingus() {}
};

此代码产生错误

error C2280: 'Dingus::<unnamed-type-diddly>::<unnamed-type-diddly>(void)': attempting to reference a deleted function

奇怪的是,当我删除提供引用的“diddly”时,没有错误。

vec3是一个来自GLM库的结构,我可以用其他类替换类型,我会得到相同的错误......但如果我用像float这样的简单替换它我不会得到错误

由于删除“diddly”会删除错误,这似乎与此问题不同one

2 个答案:

答案 0 :(得分:3)

您已声明该匿名联合类型的成员,因此需要在Dingus构造函数中初始化该成员。由于union具有非平凡类型的成员,因此它没有默认构造函数,因此无法在Dingus构造函数中初始化它。

您可以为联合类型定义一个构造函数,该构造函数说明默认构造时应该发生的情况,例如。

struct Dingus {
  union U {
    int dingly[4 *4];
    vec3 dinglyDo;
    U() : dingly() { }
  } diddly;
  inline Dingus() {}
};

答案 1 :(得分:0)

c++17开始,您可以使用std::variant代替联合来解决此问题。您的代码很容易被替换为:

struct Dingus {
    std::variant<std::array<int, 4*4>, vec3> diddly;
    inline Dingus() {}
};