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

10-13 05:37