2

decltype や std::remove_reference を使用して (delete 演算子なしで) デストラクタを呼び出すことは可能ですか? 次に例を示します。

#include <iostream>
#include <type_traits>

using namespace std;

class Test
{
    public:
    Test() {}
    virtual ~Test() {}
};

int main()
{
    Test *ptr;

    ptr->~Test(); // works
    ptr->~decltype(*ptr)(); // doesn't work
    ptr->~std::remove_reference<decltype(*ptr)>::type(); // doesn't work

return 0;
}
4

3 に答える 3

1

コンパイラがコマンドを使用したテンプレートをサポートしていない場合は、次のことができます。

テンプレート構造体を定義します。

template<class T> struct unwind_alias { static VOID destroy(T* ptr) { ptr->~T(); }; };

それを使ってオブジェクトを破壊する

unwind_alias<std::remove_reference<decltype(*ptr)>::type>::destroy(ptr);

それが誰にも役立つことを願っています。

于 2013-09-21T12:14:38.830 に答える