4

たとえば、次のような関数があります。

template <typename TYPE>
void construct_and_destruct(TYPE & object)
{
    //...
}

andのようなコンストラクタとデストラクタを呼び出すことはできません(今は真実ではありません)(Whyy?= Cobject.Type()object.~Type()

コンストラクターを呼び出すには、が好きnew(&object) TYPE()です。そして、デストラクタを呼び出す方法がわかりません(配置は存在しませんdelete)。これを行う方法?

4

4 に答える 4

6

デストラクタは次のように呼び出すことができます。

object.~TYPE();

しかし、それはあなたが望むものではない可能性が高く、二重削除の対象となります。

コンストラクターは次のように単純です。

object = TYPE();
于 2012-11-03T15:50:40.823 に答える
1

object.~TYPE()どちらも正しいとobject.~TYPE::TYPE()思います。少し疑わしいように聞こえますが、何を達成しようとしていますか?

于 2012-11-03T15:50:52.913 に答える
1

私はこれに少し異なる問題を抱えていましたが、配置-新規/削除についても同様であり、解決策は同様であるはずです。

依存型の名前を指定すると、配置はnewになります。

new (&foo) typename AT::T(arg, arg, arg);

関連する削除には注意が必要です。

foo.~ typename AT::T();  // Doesn't work, nor do variations of syntax

最新の解決策はそうであるようですstd::destroy_at(&foo)が、私のコンパイラには完全なC++17がありません。ただし、独自の基本バージョンをロールすることは難しくありません。

template <typename T>
constexpr void destroy_at(T* p)
{
  p->~T();
}

うまくいくようです。

于 2021-01-14T20:57:09.220 に答える
0

このCallingdestructorをdecltypeおよび/またはstd::remove_referenceで試してみてください。これは、修飾されていないタイプ(テンプレート引数内の指定されていない内部クラス)のデストラクタを呼び出すために機能しました。

于 2021-01-14T16:20:33.280 に答える