struct anonymous untagged union试图引用一个已删除的函数时出错



最近,我尝试将我的VS2008 c++项目转换为VS2019,因为需要更新库,支持等,我有片段,编译在VS2008上,但不与VS2019

struct A
{
WORD insideA;
A(): insideA(0)
{}
~A(){}
}
struct B
{
WORD insideB;
B():insideB(0)
{}
~B(){}
}
struct AB
{
union
{
struct { A dataA; };
struct 
{
WORD wX;
B dataB;
} 
}

AB()
:wX(0)
{}
}
struct USAGE
{
AB usageAB;
USAGE(AB &parAB)
: usageAB(parAB) //<< attempting to reference a deleted function
{}
}

在vs2008和vs2019之间有匿名联盟的任何标准变化吗?

您的代码缺少一些分号,并且联合缺少成员名。我做了一些修改,希望代码仍然能反映您的情况。是的,有关于联合的标准变化:在c++ 11之前,不允许使用非平凡构造函数的联合成员。从11开始是这样,但是联合还必须提供构造函数。所以,我猜你的代码确实在vs2008下编译由于ms的非标准语言扩展

要使代码运行,需要一个析构函数,该析构函数调用构造的联合成员的适当析构函数。那么你必须知道,哪个成员被构造了。我在下面通过添加enum class which_tm_which成员来解决这个问题。

另一种解决方法是去掉析构函数~A()~B()

你也可以考虑使用std::variant,它在c++ 17以后的标准库中。它可以代替联合和类联合的许多用法。

using WORD = unsigned short;
//////////////////////////////////////////////////////////////////////
struct A
{
WORD insideA;
explicit A(WORD x) : insideA(x)
{}
~A() {}
};
struct B
{
WORD insideB;
explicit B(WORD x) :insideB(x)
{}
~B() {}
};
enum class which_t
{
dataA,
dataB,
wX
};
struct AB
{
union
{
A dataA;
B dataB;
WORD wX;
};
which_t m_which;
AB(A const& a) // maybe you wanna leave out 'explicit' here
: dataA(a)
, m_which(which_t::dataA)
{}
AB(B const& b) // maybe you wanna leave out 'explicit' here
: dataB(b)
, m_which(which_t::dataB)
{}
AB(WORD x) // maybe you wanna leave out 'explicit' here
: wX(x)
, m_which(which_t::wX)
{}
~AB()
{
switch (m_which)
{
case which_t::dataA:
dataA.~dataA();
break;
case which_t::dataB:
dataB.~dataB();
break;
case which_t::wX:
break;
}
}
};
struct USAGE
{
AB usageAB;
explicit USAGE(AB& parAB)
: usageAB(parAB) //<< attempting to reference a deleted function
{}
};
//////////////////////////////////////////////////////////////////////
int main()
{
AB ab1(A{ 1 });
USAGE usage1(ab1);
AB ab2(B{ 2 });
USAGE usage2(ab2);
AB ab3(3);
USAGE usage3(ab3);
}

最新更新