2017-07-27 41 views
6

Funkcja std::mem::drop w Rust przenosi argument, a następnie niszczy go, wychodząc poza zakres. Moja próba pisania podobną funkcję w C++ wygląda następująco:Czy istnieje odpowiednik C++ dla `` std :: mem :: drop` w bibliotece standardowej?

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

Czy taka funkcja już istnieje w bibliotece standardowej?

Edytuj: Funkcja może być użyta do wywołania destruktora obiektu przed wyjściem poza zasięg. Rozważ klasę, która zamyka uchwyt pliku, gdy tylko zostanie zniszczona, ale nie wcześniej. Ze względu na argument, załóżmy, że ofstream nie ma metody close. Możesz napisać:

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

Nie rozumiem, dlaczego potrzebujesz czegoś takiego w C++. Jaki jest twój pożytek z tego? –

+0

Nie można nic nazwać, aby dana zmienna stała się nieważna do użycia po tym połączeniu, o ile wiem. Czy możesz zamiast tego używać bloków? '{T x; }/* x jest poza zakresem */' – Ryan

+2

Podczas nauki nowego języka czasami trzeba użyć różnych idiomów. Nie widzę przypadku, w którym 'drop' byłby jak idiomatyczne C++. Szczerze mówiąc nie mogę wymyślić ani jednego powodu, dla którego byś tego chciał. –

Odpowiedz

6

Standardowa biblioteka C++ nie ma takiej funkcji. Można jednak osiągnąć ten sam efekt z tego idiomu:

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

Jak zauważył w komentarzach, C++ brakuje zdolności do rdzy faktycznie zapobiec Państwo z dalszego korzystania var. Jego zawartość została przeniesiona z, ale w C++ wciąż jest żywym, prawidłowym obiektem, a można go nawet użyć ponownie, prawidłowo przenosząc go do dobrze zdefiniowanego stanu.

Oczywiście wymaga to, aby typ był przenośny. Niektóre typy, takie jak lock_guard, nie są, więc jesteś trochę tam uwięziony. Oznacza to, że jedynym sposobem na szybkie zamknięcie jest użycie wbudowanego interfejsu.

+2

'' // 'var' został zniszczony.' Not really, wciąż możesz go przypisać na przykład. Nadal nie wiem, co to ma osiągnąć. –

+0

Czy ktoś taki był skłonny, mógłbyś zrobić funkcję, która miałby ten sam efekt? – Shepmaster

+1

@BaummitAugen: Osiąga zniszczenie wszystkiego, co "var" zarządzane. Jeśli był to plik, plik został zamknięty. Jeśli był to współdzielony wskaźnik, liczba odwołań zmniejszyła się. –