gpt4 book ai didi

c++ - 在结构的 union 成员中使用 std::string 时无法引用默认构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:07:14 26 4
gpt4 key购买 nike

我有一个非常基本的结构,它有一个枚举和一个 union 。

typedef struct
{
enum v{a,b,c}v;
union w{
int a;
bool b;
std::string c;
}w;

}Data_Set2;

int main()
{
Data_Set2 val; // Shows errror that the default constructor cannot be referenced
return 0;
}

在使用这样的结构时,我得到了无法引用默认构造函数的错误代码 C2280。当我以如下略微不同的方式声明结构时

typedef struct
{
enum v{a,b,c}v;
union w{
int a;
bool b;
std::string c;
}; // changed here.

}Data_Set2;

错误不再存在。我不明白这背后的原因。谁能解释为什么会这样

最佳答案

来自 https://en.cppreference.com/w/cpp/language/union (或参见 standard ):

If a union contains a non-static data member with a non-trivial special member function (copy/move constructor, copy/move assignment, or destructor), that function is deleted by default in the union and needs to be defined explicitly by the programmer.

If a union contains a non-static data member with a non-trivial default constructor, the default constructor of the union is deleted by default unless a variant member of the union has a default member initializer .

At most one variant member can have a default member initializer.

在您的情况下,这意味着您必须显式声明构造函数和析构函数。将您的代码更改为:

typedef struct
{
enum v{a,b,c} v;
union w{
int a;
bool b;
std::string c;
w() {} // Explicit constructor definition
~w() { }; // Explicit destructor definition
} w;

} Data_Set2;

这应该有效。

正如我在评论中所述,您应该查看 std::anystd::variant。后者提供类型安全的 union ,在您的情况下可能是更好的选择。请注意,您的编译器(显然是 MSVC)需要支持 C++17。

编辑:正如 eerorika 评论的那样,您需要确保只在当前活跃的成员上调用它。开头链接的引用显示了一个字符串/vector union 的示例,以及它如何为未定义的行为引入许多陷阱。因此,除非您只是想了解幕后发生的事情或使用 POD 类型,否则我建议您改为使用 std::variant

关于c++ - 在结构的 union 成员中使用 std::string 时无法引用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com