2016-07-23 7 views
1

で明示的にオブジェクト:破壊尖った-する私が持っているdecltype

p->~decltype(*p)(); 

しかし、それは仕事をdoesntの:

T* p; 

と私がやりたいと思います。

p->~T(); 

でも可能ですが、可能であればdecltype()とします。

エラーメッセージ:

error: expected class-name before 'decltype' 

編集:私は、配列の新しいのalloca +配置を使用してスタックに割り当てられた配列のためのVLAの使用を避けるためにしようとしている

ユースケース。新しい配置の後、スタック配列内のオブジェクトを明示的に破棄する必要があります。これが必要な理由私が困惑してる、

using T = ::std::remove_reference_t<decltype(*p)>; 
p->~T(); 

しかし:私は私が行うことができ、問題を解決する方法を知っています。

+2

'decltype(* P) 'は' T 'ではなく' T 'です。あなたが構文を受け入れても、それはまだ動作しません。 – hvd

+0

意味がありません。これは、もはや関数を呼び出すことと同じではありません。ユースケースについて簡単に説明できますか? – Arunmu

+0

私は不思議です、あなたはVLAが持っていないものを「alloca」と呼んでいますか? 'alloca'は、VLAやVLAが少なくとも例外を適切に処理し、必要に応じて自動的に構築して破壊するコンパイラサポートを持っているのと同じように非標準です。他にも重要な違いがありますか? – hvd

答えて

6

あなたは誤解していますdecltypeです。疑似デストラクタ呼び出しには参照型でないものが必要です。

これを試してみてください:これは、使用している

int * p = new int; 
p->~decltype(declprval<decltype(*p)>())(); 

template <typename T> std::decay_t<T> declprval(); 

decltype指定子のうち、式の減衰したタイプの取得ハードワークです。 "実際のコード" で、私はちょうど使用したい:

int * p = new int; 
{ 
    using T = std::remove_reference_t<decltype(*p)>; 
    p->~T(); 
} 
+1

注:標準ライブラリの 'std :: declval'は、prvalueではなく、glvalueを生成するので、このトリックには適していません。 –

3

をどうのようなものについては、次のようにこれを使用することができます

template<typename T> 
void call_destructor(T* obj) 
{ 
    obj->~T(); 
} 

SomeClass* p = new SomeClass(); 
<...> 
call_destructor(p); 
+0

非常にいいですが、STLで利用できるものはありますか? – user1095108

+3

@ user1095108 ['std :: destroy_at'](http://en.cppreference.com/w/cpp/memory/destroy_at)C++ 17 – cpplearner

+0

@cpplearnerうわー、それは計画されていたのか分かりませんでした。 –

関連する問題