其他分享
首页 > 其他分享> > c – 如何使模板右值引用参数仅绑定到右值引用?

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(标准::移动(some_lvalue));

但问题是:C模板推导允许在没有额外努力的情况下传递左值.我实际上是因为不小心将左值传递给receive_ownership并且稍后使用了左值(清除)而将自己击中一只脚.

所以这是一个问题:如何使模板仅绑定到右值参考?

解决方法:

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

#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,rvalue-reference
来源: https://codeday.me/bug/20190923/1815463.html