在标准库中是否有一个等同于Rust的`std :: mem :: drop`的C++?

Fri*_*ich 7 c++ destructor lifetime move-semantics rust

std::mem::dropRust中的函数移动其参数,然后通过超出范围来销毁它.我在C++中编写类似函数的尝试如下所示:

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

标准库中是否已存在此类功能?

编辑:该函数可用于在超出范围之前调用对象的析构函数.考虑一个类,它会在文件句柄被销毁后立即关闭,但不会更早.为了论证,假设ofstream没有close方法.你可以写:

ofstream f("out");
f << "first\n";
drop(move(f));
// f is closed now, and everything is flushed to disk
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 7

C++的标准库没有这样的功能.但是,你可以用这个成语来达到同样的效果:

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

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

当然,这要求类型是可移动构造的.有些类型不喜欢lock_guard,所以你有点在那里.这意味着早期关闭它的唯一方法是使用其内置接口.

  • ``//`var`已经被破坏.`不是真的,你仍然可以分配给它.而且,我仍然没有做到这一点. (2认同)
  • @BaummitAugen:它完成了对任何`var`管理的破坏.如果是文件,则关闭文件.如果它是共享指针,则引用计数已减少. (2认同)
  • @BaummitAugen Nicol Bolas在现在删除的兄弟回答中说:*这个想法的意思是你有一个仍然在范围内的堆栈变量,但是你已经完成了它并且希望清理对象.像ifstream或者其他东西,析构函数关闭文件.你不想让它保持打开时间超过需要,但是为了能够重置它而堆积分配它是愚蠢的.* (2认同)