我正在编写一个网络库,并且大量使用移动语义来处理文件描述符的所有权。我的其中一个类希望接收其他类型的文件描述符包装器并拥有所有权,所以大致是这样的。
但问题是,C++模板推导允许不需要额外努力就可以传递一个左值。而我曾经不小心将一个左值传递给
所以问题来了:如何创建一个只绑定到右值引用的模板参数?
struct OwnershipReceiver
{
template <typename T>
void receive_ownership(T&& t)
{
// taking file descriptor of t, and clear t
}
};
它必须处理多个不相关的类型,所以receive_ownership()
必须是一个模板。为了安全起见,我希望它只绑定到右值引用,这样用户在传递左值时必须明确使用std::move()
。
receive_ownership(std::move(some_lvalue));
但问题是,C++模板推导允许不需要额外努力就可以传递一个左值。而我曾经不小心将一个左值传递给
receive_ownership()
,并在之后使用了那个被清除的左值,结果自己踩了个坑。所以问题来了:如何创建一个只绑定到右值引用的模板参数?
is_rvalue_reference<T&&>::value
吗?(注意&&
符号) - fredoverflow!std::is_lvalue_reference<T>::value
还是std::is_rvalue_reference<T&&>::value
?(第二种方法似乎更优雅,因为它告诉你t
的实际类型。) - alfCT&& a
就可以做到这一点。这也意味着如果我们想要一个只接受模板类型T
的右值引用的模板,我们必须编写额外的代码。最终他们说你可以将其写为auto&& a
,但其他语法将永远存在。 - user904963