You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2008迁移至VS2019时匿名联合引发‘尝试引用已删除函数’错误的技术咨询

VS2008到VS2019迁移中匿名联合引发的删除构造函数问题解析

你碰到的这个编译报错,根源在于VS2008和VS2019对C标准中匿名联合的处理规则有本质差异,尤其是C11标准发布后带来的严格约束。

核心标准变更点

  • C++03(VS2008默认支持)的宽松规则
    在C++03标准中,匿名联合的限制非常宽松,允许包含带有自定义构造函数、析构函数的非平凡类型(比如你的struct A和struct B),编译器不会因此自动删除外围类的拷贝操作。

  • C++11及以后(VS2019默认支持)的严格约束
    从C++11开始,标准明确规定:匿名联合不能包含带有非平凡构造函数、析构函数、拷贝/移动操作的成员。如果违反这个规则,匿名联合所属的外围类(这里是struct AB)的拷贝构造函数、拷贝赋值运算符会被编译器自动标记为删除状态。

你的代码为什么会报错

你的struct AB包含了一个匿名联合,而联合内的A和B都有自定义的构造、析构函数(属于非平凡类型)。在VS2019启用C++11+标准的情况下,编译器自动删除了AB的拷贝构造函数。而struct USAGE的构造函数试图通过usageAB(parAB)拷贝初始化AB类型成员,这就触发了对已删除函数的引用,最终导致编译失败。

可行的解决方案

1. 显式定义AB的拷贝构造函数

既然编译器自动删除了拷贝构造,我们可以手动实现符合业务逻辑的拷贝逻辑:

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) {}
    // 显式实现拷贝构造,根据你的需求处理联合成员的拷贝
    AB(const AB& other) {
        // 示例:拷贝wX和dataB,注意联合内存重叠的特性
        wX = other.wX;
        dataB = other.dataB;
    }
};
struct USAGE {
    AB usageAB;
    USAGE(AB &parAB) : usageAB(parAB) {}
};

2. 将匿名联合改为命名联合

命名联合不受C++11+中关于非平凡类型的限制(只需自己管理好构造析构逻辑),编译器不会自动删除外围类的拷贝操作:

struct A { WORD insideA; A(): insideA(0) {} ~A(){} };
struct B { WORD insideB; B():insideB(0) {} ~B(){} };
struct AB {
    // 给联合添加名称
    union ABUnion {
        struct { A dataA; };
        struct { WORD wX; B dataB; };
        ABUnion() :wX(0) {}
        // 按需实现拷贝构造
        ABUnion(const ABUnion& other) {
            wX = other.wX;
            dataB = other.dataB;
        }
    } unionData;
    AB() : unionData() {}
};
struct USAGE {
    AB usageAB;
    USAGE(AB &parAB) : usageAB(parAB) {}
};

3. 临时回退到C++03标准(不推荐长期使用)

如果只是临时兼容旧代码,可以在VS2019中将项目的C标准设置为ISO C++98 Standard,或者开启/Zc:strict-编译选项关闭严格模式。但这种方式会让你失去C11及以后的特性支持,仅建议作为过渡方案。

内容的提问来源于stack exchange,提问作者navirius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:37:38