我正在编写一个网络库,并大量使用移动语义来处理文件描述符的所有权。我的一个类(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/