2017-07-27 69 views
6

Rust中的函數std::mem::drop移動它的參數,然後通過超出範圍來破壞它。我在C++寫的類似功能的嘗試看起來是這樣的:在標準庫中是否有一個C++等價於Rust的`std :: mem :: drop`?

template <typename T, 
      typename = std::enable_if_t<std::is_rvalue_reference<T &&>::value>> 
void drop(T &&x) { 
    T(std::move(x)); 
} 

請問這樣的功能已經存在於標準庫?

編輯:該函數可用於在超出作用域之前調用對象的析構函數。考慮一個一旦它被銷燬就關閉一個文件句柄的類,但不會更早。爲了論證的緣故,假設ofstream沒有close方法。你可以這樣寫:

ofstream f("out"); 
f << "first\n"; 
drop(move(f)); 
// f is closed now, and everything is flushed to disk 
+5

我不明白你爲什麼需要在C++中這樣的東西。你的用途是什麼? –

+0

據我所知,沒有任何東西可以調用,以使該調用後給定的變量無效。是否有可能只是使用塊而已? '{T x; }/* x超出範圍* /' – Ryan

+2

學習一種新語言時,有時你必須使用不同的習語。我看不到一個'drop'就像是慣用的C++的情況。我誠實地想不出你想要它的一個單一原因。 –

回答

6

C++的標準庫沒有這樣的功能。但是,可以達到相同的效果用這個成語:

SomeType var = ...; 
//do stuff with `var`. 
{auto _ = std::move(var);} 
//The contents of `var` have been destroyed. 

正如在評論中指出,C++缺乏鏽病的能力,實際上防止您進一步使用var。它的內容已經被移除,但是在C++中它仍然是一個實時的,有效的對象,甚至可以通過將它正確地轉換到一個定義良好的狀態來重用它。

當然,這要求該類型是可移動的可構造的。有些類型,如lock_guard不是,所以你有點在那裏。這意味着早期關閉它的唯一方法是使用其內置的界面。

+2

''//'var'已被銷燬。「不是,你仍然可以指定它。另外,我仍然不會完成這個任務。 –

+0

如此傾斜,你能否做出一個具有相同效果的功能? – Shepmaster

+1

@BaummitAugen:它完成了管理任何'var'的銷燬。如果它是一個文件,則該文件關閉。如果它是共享指針,則引用計數已減少。 –

相關問題