防止将左值引用绑定到非const对象

preventing binding of lvalue references to non-const objects

本文关键字:const 对象 绑定 引用      更新时间:2023-10-16

我想防止将非const对象的左值引用绑定到我的函数参数,目前我有以下代码:

template <typename T>
using remove_cr = std::remove_const<typename std::remove_reference<T>::type>;
template <typename T>
using is_nc_lvalue_reference
  = std::integral_constant<bool,
      std::is_lvalue_reference<T>::value
      && !std::is_const<typename std::remove_reference<T>::type>::value
    >;
template <typename T>
void func(T && v, typename std::enable_if<
  std::is_same<THE_TYPE_I_WANT, typename remove_cr<T>::type>::value
  && !is_nc_lvalue_reference<T>::value>::type* = 0)
{
}

这对我来说似乎是非常多的代码,是否存在更优雅的SFINAE或非SFINAE方法?我不需要完全转发,但如果我不使用它,我就会失去T

这个想法是,const对象不应该被修改,因此我可以将它们转换为其他表示并馈送它们,说到不同的进程。如果给出了一个非const引用,它引用的对象可以被修改,但是另一个进程没有访问转发进程的内存空间,因此我不转发它。

这个怎么样:

template <typename T>
void func(const T &x) {
  process(x);
}
template <typename T>
void func(T &x) {
  do_nothing(x);
}