gpt4 book ai didi

c++ - 标准库中是否有与 Rust 的 `std::mem::drop` 等效的 C++?

转载 作者:可可西里 更新时间:2023-11-01 18:30:48 24 4
gpt4 key购买 nike

函数std::mem::drop在 Rust 中 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 这样的类型不是,所以你有点受不了了。这意味着提前关闭它的唯一方法是使用其内置界面。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com