当我将结构放入联合中时,没有可用的默认构造函数,但如果它在外部,则没有错误

No default constructor available when I put a struct in an union, but no errors if it is outside

本文关键字:构造函数 默认 如果 有错误 外部 结构      更新时间:2024-09-23

我正试图将RenderTargetView放入下面定义的并集中。

但当我尝试这样做时,我会得到没有可用的默认构造函数的错误。我确信应该有默认的构造函数,因为所有的东西都是定义好的。

此外,如果我将RenderTargetView放在联合之外,我将不再收到该错误。有人知道这里发生了什么吗?

Error消息:

GP::Private::ResourceView::ResourceView(void(':试图引用已删除的函数函数被隐式删除,因为"GP::Private::ResourceView"有一个具有非平凡默认构造函数的变体数据成员"GP:;Private:;ResourceView::RTView">

struct RenderTargetView
{
static constexpr uint32_t INVALID_INDEX = static_cast<uint32_t>(-1);
uint32_t Index = INVALID_INDEX;
};
struct FailingStruct
{
union
{
RenderTargetView RTView;
};
};
只有当联合的所有成员都有琐碎的构造函数时,联合才有默认的未删除构造函数。析构函数也是如此。由于结构有一个成员初始值设定项,这意味着它没有一个琐碎的构造函数,也意味着联合构造函数被删除。您需要为联合创建特殊成员,将其委派给活动成员。

或者最好使用std:: variant,它为您创建了所有这些。

至于为什么它很简单:联合不知道哪个成员是活动的,所以它不能调用适当的构造函数/析构函数。