2016-07-23 76 views
1

我有明確的反對:破壞尖,與decltype

T* p; 

,我想這樣做:

p->~decltype(*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

我很好奇,'alloca'給你帶來的是什麼,VLA不會呢? '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'產生一個glvalue,而不是一個prvalue,所以它不適合這個技巧。 –

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哇,不知道這是計劃。 –