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) 假设我正在做一些套接字编程:
struct sockaddr_in sa;
inet_pton(AF_INET, "127.0.0.1", &(sa.sin_addr));
auto *resa = reinterpret_cast<struct sockaddr*>(&sa);
bind(sfd, resa, sizeof(sa));
Run Code Online (Sandbox Code Playgroud)
现在的问题是:我们这样做了reinterpret_cast(或者(struct sockaddr *)像教程或 man 中的C 风格类型转换)但是标准并不能保证它可以工作,对吧?另一方面,似乎没有办法以不同的方式做到这一点,bind()需要struct sockaddr*(并且它必须访问底层结构以确定它收到了什么)。
那么reinterpret_cast在这种情况下在不同类型之间进行操作是否安全?如果是,那为什么?