gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:16 25 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/34033831/

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