gpt4 book ai didi

c++ - 如何使模板右值引用参数仅绑定(bind)到右值引用?

转载 作者:IT老高 更新时间:2023-10-28 12:43:06 28 4
gpt4 key购买 nike

我正在编写一个网络库并大量使用移动语义来处理文件描述符的所有权。我的一个类(class)希望接收其他类型的文件描述符包装器并获得所有权,所以它类似于

struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};

它必须处理多个不相关的类型,因此 receive_ownership 必须是一个模板,并且为了安全起见,我希望它只绑定(bind)到右值引用,以便用户在传递左值时必须显式声明 std::move。

receive_ownership(std::move(some_lvalue));

但问题是:C++ 模板推导允许传入一个左值而不需要额外的努力。实际上,我不小心将一个左值传递给了receive_ownership,并在以后使用该左值(清除),实际上是在开枪打死自己。

那么问题来了:如何让模板只绑定(bind)到右值引用?

最佳答案

您可以限制 T 不是左值引用,从而防止左值绑定(bind)到它:

#include <type_traits>

struct OwnershipReceiver
{
template <typename T,
class = typename std::enable_if
<
!std::is_lvalue_reference<T>::value
>::type
>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};

T 添加某种限制也是一个好主意,这样它只接受文件描述符包装器。

关于c++ - 如何使模板右值引用参数仅绑定(bind)到右值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863603/

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