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
Nie rozumiem, dlaczego potrzebujesz czegoś takiego w C++. Jaki jest twój pożytek z tego? –
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
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ł. –