c++ - 如何使用模板推导类型为右值和左值引用获取不同的重载?

标签 c++ c++11 templates rvalue-reference forwarding-reference

我有一个函数 foo 通过引用获取参数,我希望它对右值和左值引用采取不同的操作。 (我还应该提到 foo() 尊重常量;它不会改变引用的值。)我知道如果我写:

template <typename T> foo(T&& x);

我已经声明了一个 forwarding reference ,而不是右值引用,这意味着这样:

template <typename T> foo(const T& x);
template <typename T> foo(T&& x);

可能得不到我想要的。

所以,我的问题是:影响两种引用之间不同行为的正确方法是什么?

最佳答案

你可以有一个左值引用重载和一个转发引用重载:

template <typename T> void foo(T& ) { ... }
template <typename T> void foo(T&& ) { ... }

对于左值,优先使用第一个重载。对于右值,只有第二个重载是可行的。


如果你想要的是一个 const 左值引用重载和一个非 const 右值引用重载,那么你只需要在转发引用的情况下添加一个约束:

template <typename T> void foo(T const& ) { ... }
template <typename T, REQUIRES(!std::is_reference<T>::value)>
void foo(T&& ) { ... }

其中 REQUIRES 是您选择的方法。现在,对于我们的四种情况:

  • 非常量,左值:只有 1st 是可行的
  • const 左值:只有 1st 是可行的
  • 非常量,右值:两者都可行,第二个是更好的匹配
  • const rvalue:两者都可行,第二个是更专业更好的匹配

关于c++ - 如何使用模板推导类型为右值和左值引用获取不同的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935605/

相关文章:

json - Azure ARM 内联 IF 不工作

c++ - 将任何类型的 std::vector 传递给函数

c++ - C2039 : 'Method' +W is not a member of Class

c++ - 使用指向压缩结构成员的指针时出现编译器警告

c++ - 什么是次正规 float ?

c++ - 在 C++ 接口(interface)中声明模板函数?

python - 如何在没有 XGBoost 库的情况下生成 XGBoost 输出?

c++ - OpenMP omp_get_num_threads()V.S. omp_get_max_threads()

c++ - 强制执行显式默认的特殊成员函数生成

c++ - 为什么这个 map<int, auto> 是不允许的?