标准库中是否有与 Rust 的 `std::mem::drop` 等效的 C++?
Is there a C++ equivalent to Rust's `std::mem::drop` in the standard library?
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));
}
标准库中是否已经存在这样的函数?
编辑: 该函数可用于在超出范围之前调用对象的析构函数。考虑一个 class,它在文件句柄被销毁后立即关闭,但不会更早。为了论证,假设 ofstream
没有 close
方法。你可以这样写:
ofstream f("out");
f << "first\n";
drop(move(f));
// f is closed now, and everything is flushed to disk
C++的标准库没有这个函数。然而,你可以用这个成语达到同样的效果:
SomeType var = ...;
//do stuff with `var`.
{auto _ = std::move(var);}
//The contents of `var` have been destroyed.
正如评论中所指出的,C++ 缺乏 Rust 的能力,无法真正 阻止 你进一步使用 var
。它的内容已被移出,但在 C++ 中它仍然是一个活动的、有效的对象,您甚至可以通过将其适当地转换为明确定义的状态来重用它。
当然,这需要类型是可移动构造的。某些类型如 lock_guard
不是,所以你在那里有点麻烦。这意味着提前关闭它的唯一方法是使用其内置界面。
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));
}
标准库中是否已经存在这样的函数?
编辑: 该函数可用于在超出范围之前调用对象的析构函数。考虑一个 class,它在文件句柄被销毁后立即关闭,但不会更早。为了论证,假设 ofstream
没有 close
方法。你可以这样写:
ofstream f("out");
f << "first\n";
drop(move(f));
// f is closed now, and everything is flushed to disk
C++的标准库没有这个函数。然而,你可以用这个成语达到同样的效果:
SomeType var = ...;
//do stuff with `var`.
{auto _ = std::move(var);}
//The contents of `var` have been destroyed.
正如评论中所指出的,C++ 缺乏 Rust 的能力,无法真正 阻止 你进一步使用 var
。它的内容已被移出,但在 C++ 中它仍然是一个活动的、有效的对象,您甚至可以通过将其适当地转换为明确定义的状态来重用它。
当然,这需要类型是可移动构造的。某些类型如 lock_guard
不是,所以你在那里有点麻烦。这意味着提前关闭它的唯一方法是使用其内置界面。