c++ - 防止将左值引用绑定(bind)到非常量对象

标签 c++ c++11

我想防止将对非常量对象的左值引用绑定(bind)到我的函数参数,目前我有这段代码:

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 对象,因此我可以将它们转换为其他表示形式并将它们提供给不同的进程。如果给出非常量引用,它引用的对象可以被修改,但是其他进程没有权限访问转发进程的内存空间,因此我不转发它。

最佳答案

这个怎么样:

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

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

Example在行动中。

关于c++ - 防止将左值引用绑定(bind)到非常量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577549/

相关文章:

c++ - Rcpp 中用户编写的 header /命名空间中的函数声明

c++ - 范围解析而不是 .模板类参数的运算符

c++ - 简化的元组实现

python - [咖啡] : Check failed: ShapeEquals(proto) shape mismatch (reshape not set)

C++ Double Dispatch、Factory Pattern 或一种从接收到的串行数据自动创建派生对象的方法

c++ - std::map::emplace 语法问题

c++ - gcc 要求使用 -std=c++11 即使我已经在使用它

c++ - 为什么 C++ 并发在 action listing_6.1 中不使用 std::recursive_mutex

c++ - 在 C++ 中从 double 更改为 long double 不再给出正确的结果

c++ - 是否可以在对象实例化期间定义 std::array 类成员的元素计数?