小编Fri*_*ich的帖子

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

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)

c++ destructor lifetime move-semantics rust

7
推荐指数
1
解决办法
331
查看次数

使用 sockaddr 安全 reinterpret_cast?

假设我正在做一些套接字编程:

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在这种情况下在不同类型之间进行操作是否安全?如果是,那为什么?

c++ type-safety undefined-behavior reinterpret-cast

6
推荐指数
1
解决办法
1208
查看次数