Rust中的 std::mem::drop 函数 move 其参数,然后通过超出范围将其销毁。我在C++中编写类似功能的尝试如下所示:

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

最佳答案

C++的标准库没有此类功能。但是,您可以使用以下成语实现相同的效果:

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

正如评论中指出的那样,C++缺乏Rust的能力,实际上无法阻止您进一步使用var。它的内容已从中移出,但是在C++中,它仍然是一个有效的实时对象,您甚至可以通过将其正确转换为定义良好的状态来重用它。

当然,这要求该类型是可 move 构造的。诸如lock_guard之类的某些类型不是,所以您有点麻烦了。这意味着尽早关闭它的唯一方法是使用其内置接口(interface)。

关于c++ - 标准库中是否有等效于Rust的 `std::mem::drop`的C++?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45362132/

10-10 01:02