2017-07-27 8 views
6

錆の関数std::mem::dropは、引数を移動してスコープ外に出て破棄します。同じような関数をC++で書こうとする私の試みは次のようになります:標準ライブラリにRustの `std :: mem :: drop`と同等のC++がありますか?

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

このような関数は標準ライブラリにすでにありますか?

編集:この機能を使用して、スコープから外れる前にオブジェクトのデストラクタを呼び出すことができます。破棄されるとすぐにファイルハンドルを閉じるクラスを考えてみましょう。議論のために、ofstreamcloseメソッドがないとします。

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

1つの傾向があったので、同じ効果を持つ関数を作れますか? – Shepmaster

+1

@BaummitAugen:これは 'var'が管理しているものを破壊します。それがファイルの場合、ファイルは閉じられます。共有ポインタの場合は、参照カウントが減少しています。 –

関連する問題