【问题标题】:Attempting to reference a deleted function error with anonymous union尝试使用匿名联合引用已删除的函数错误
【发布时间】:2018-01-29 16:26:42
【问题描述】:
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不同的问题

【问题讨论】:

  • @LogicStuff 这是 GLM 库中的一个结构,我可以用其他一些东西替换类型,我会得到同样的错误......但如果我用像 float 这样简单的东西替换它,我不会'没有得到错误
  • "delete the "diddly",从而给出一个名称来引用联合"是什么意思?您将union { ... } diddly; 更改为union Foo { ... };?因为如果是这样,那意味着完全不同的东西,所以Dingus 构造函数不会尝试默认初始化该类型的对象,所以它编译一点也不奇怪。
  • @JonathanWakely 抱歉,我说得更清楚了。我的意思是说,当我把union { ... } diddly;变成union { ... }时,没有错误

标签: c++


【解决方案1】:

您已经声明了该匿名联合类型的成员,因此需要在 Dingus 构造函数中初始化该成员。因为 union 有一个 non-trivial 类型的成员,它没有默认构造函数,所以不能在 Dingus 构造函数中初始化。

您可以为联合类型定义一个构造函数,它说明当它是默认构造时应该发生什么,例如

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

【讨论】:

  • @KerrekSB 也许这条评论将他们推到了边缘。 variant
  • @FantasticMrFox:是的。委员会一直在纠结是否要花时间探索当时正在浮出水面的新方向,例如“结节”、“感知”和“独角兽调用语法”,但当这个评论出现时,一切都被放弃了,国家身体在首席召集人后面对齐,并开始在支持变体的文件后发送文件。一些人警告说,我们将在接下来的 20 年内致力于变体。有笑声。
【解决方案2】:

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

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

【讨论】:

  • 您不能将数组存储在std::variant 中,请使用std::array
  • @JonathanWakely 虽然我改变了它,而且我不知道你会如何使用数组,但它确实可以编译...coliru.stacked-crooked.com/a/5c4c50ffbc38722b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2015-07-23
  • 2014-02-19
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多