簡體   English   中英

如何在模板項成員上顯式調用析構函數

[英]How to explicitly call the destructor on a templated item member

編譯以下代碼(如果願意,粘貼到Godbolt)

struct array {
    ~array();
};

struct node {
    array children;
};

void foo(node* bar) {
    bar->children.~array();
}

但是,如果我使用模板,則當我顯式引用模板類型時,編譯器會收到語法錯誤。 為什么並且有可行的解決方案?

 #include <vector>
 struct node {
     std::vector<node> children;
 };

 void foo(node* bar) {
     bar->children.~std::vector<node>();
 }

Clang對錯誤消息更有用:

 <source>:7:20: error: '~' in destructor name should be after nested name specifier
 bar->children.~std::vector<node>();`

因此,基本上,您需要依靠ADL(我不是專家,所以也許它是使它起作用的東西的錯誤名稱:))在這里,然后調用: bar->children.~vector<node>();

從C ++ 17開始 ,您可以使用std::destroy_at

std::destroy_at(&bar->children);

在C ++ 17之前 ,可以輕松地手動實現此功能(當然,在std名稱空間之外),如下所示:

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

IMHO的用法要好於顯式調用析構函數,這會帶來名稱空間問題。 參見,例如, 如何顯式調用命名空間限定的析構函數?

根據[class.dtor] / 14

在一個顯式的析構函數調用中,該析構函數由~指定,后跟一個表示該析構函數的類類型的類型名稱decltype-specifier

因此,在顯式調用中刪除std:: 但是,僅在某些情況下才需要顯式調用析構函數,例如使用placement new來分配內存。 請參閱此常見問題解答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM