使用别名模板和继承的显式析构函数调用

Explicit destructor call with an alias template and inheritance

受问题及其答案 Calling destructor with decltype and\or std::remove_reference 的启发,我一直在尝试在我的代码中做同样的事情。不幸的是,下面的 MWE

template<class T>
using alias = T;

class Yo {
    public:
        ~Yo() { }
};

template<class A>
class Lo {
    protected:
        A a;
};

template<class A>
class Foobar : public Lo<A> {
    public:
        typedef Lo<A> super;
        inline void expl() {
                super::a.~alias<decltype(super::a)>();
        }
};

int main() {
    Foobar<Yo> A;
    A.expl();
}

用 g++ 编译很好,但是用 clang 我得到

mwe.cpp:20:27: error: 'alias' following the 'template' keyword does not refer to a template

有了 icpc,我得到了

mwe.cpp(20): internal error: bad pointer

我不确定这是否是正确的 C++,或者这是否是编译器内部的错误。您看到解决方法了吗?

我找到了让它起作用的方法。但是要这样做,我必须在 Lo class public

中创建变量 a
 template<class T>
 using alias = T;

class Yo {

public:
    ~Yo() { }
};

template<class A>
class Lo {
public:
    A a;
};

template<class A>
class Foobar : public Lo<A> {
public:
    typedef Lo<A> super;

    using type = alias<decltype(super::a)>;

    inline void expl() {
            super::a.~type();
    }
};

int main() {
   Foobar<Yo> A;
   A.expl();
}

编辑我刚刚想到了一些事情

在 Foobar class 你得到一个模板参数 A,它将被传递给超级 class Lo。所以变量 a 具有您在模板中获得的类型! 所以你可以简单地做:

using type = alias<A>;

inline void expl() {
        super::a.~type();
}

现在你可以拥有一个受保护的变量a link