首页 > 解决方案 > 库类型的析构函数是否定义良好?

问题描述

例如iterator类型 - 这里我需要有一个不同类型的多态迭代器,具体取决于使用情况。所以我用用户定义的构造函数和析构函数创建了一个联合:

我特别质疑析构函数的名称(例如。~iterator())。

#include <list>
#include <string>

struct val_origin {
    union {
        std::list<std::list<std::string>>::iterator iterenum;
        std::list<std::list<std::list<struct var>>>::iterator iterunorstr;
        std::list<struct var>::reverse_iterator vartypedef;
    };

    enum ORIG_ENUM {
        ORIG_ENUM_TYPE,
        ORIG_STRUC_TYPE,
        ORIG_TYPEDEF,
        ORIG_PLAIN
    } orig;

    val_origin(ORIG_ENUM orig) {
        switch (orig) if (0)
        case ORIG_ENUM_TYPE:
            new (&iterenum)decltype(iterenum) {};
        else if (0)
        case ORIG_STRUC_TYPE:
            new (&iterunorstr)decltype(iterunorstr) {};
        else if (0)
        case ORIG_TYPEDEF:
            new (&vartypedef)decltype(vartypedef) {};
    }

    val_origin& operator=(const val_origin& val_origin_in) {
        this->~val_origin();

        new (this)val_origin{ val_origin_in };
    }

    val_origin(const val_origin& val_origin) {
        switch (orig) if (0)
        case ORIG_ENUM_TYPE:
            iterenum = val_origin.iterenum;
        else if (0)
        case ORIG_STRUC_TYPE:
            iterunorstr = val_origin.iterunorstr;
        else if (0)
        case ORIG_TYPEDEF:
            vartypedef = val_origin.vartypedef;
    }

    ~val_origin() {
        switch (orig) if (0)
        case ORIG_ENUM_TYPE:
            iterenum.decltype(iterenum)::~iterator();
        else if (0)
        case ORIG_STRUC_TYPE:
            iterunorstr.decltype(iterunorstr)::~iterator();
        else if (0)
        case ORIG_TYPEDEF:
            vartypedef.decltype(vartypedef)::~reverse_iterator();
    }
};

现在我的问题是上面的代码在gcc上编译得很好。但是当我切换到 clang 或 MSVC 时它失败了。

我的问题是这是否是标准代码(希望从标准中引用,我无法找到相关信息),如果不是,我实现此代码的其他选择是什么。

我正在尝试拥有一个动态(运行时)多态迭代器(相同的对象但不同类型的迭代器将被代码的不同部分适当地使用)。

代码在 MSVC 上失败,因为析构函数名称未知。

标签: c++gccvisual-c++polymorphismc++20

解决方案



推荐阅读