gpt4 book ai didi

c++ - 如何创建此标记 union 的实例?关于已删除构造函数的编译器错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:50 24 4
gpt4 key购买 nike

这是我标记的 union :

struct UniformVariant
{
enum class UNIFORM_TYPE {FLOAT, INT32, VEC2, VEC3, VEC4, MAT4} type;
union
{
float f;
int i;
glm::vec2 v2;
glm::vec3 v3;
glm::vec4 v4;
glm::mat4 m4;
} value;
};

如果我尝试这样使用它:

void some_function()
{
UniformVariant v;
some_other_function(v);
}

我收到编译错误 use of deleted function 'UniformVariant::UniformVariant()'

它进一步表示它被隐式删除,因为默认定义的格式不正确。所以我尝试向 UniformVariant

添加构造函数
UniformVariant() : value(0.0f), type(UNIFORM_TYPE::FLOAT) { };

但是类似的问题。我认为这与在 union 中包含类类型有关;但我无法弄清楚正确使用它的语法。

最佳答案

来自 [class.union] 中的注释:

If any non-static data member of a union has a non-trivial default constructor (12.1), copy constructor (12.8), move constructor (12.8), copy assignment operator (12.8), move assignment operator (12.8), or destructor (12.4), the corresponding member function of the union must be user-provided or it will be implicitly deleted (8.4.3) for the union.

该 union 中的一种类型具有非平凡的默认构造函数,因此您不能默认构造该 union 。考虑这个更简单的复制:

struct X {
X() { }
};

struct Y {
union {
float f;
X x;
} value;
};

int main()
{
Y y;
}

X 有一个非平凡的默认构造函数,因此 Y::Y() 被隐式删除,因为匿名 union 默认构造函数被隐式删除。

但是,您可以只为该 union 提供您自己的默认构造函数:

union U {
U() : f(0.f) { }

float f;
X x;
} value;

现在示例可以编译了。

但是,如果您只是实现自己的标记 union ,我强烈建议您使用 Boost.Variant .它非常有用,正好解决了这个问题。

关于c++ - 如何创建此标记 union 的实例?关于已删除构造函数的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31026316/

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