我有一个函数 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/