我有一个函数foo
通过引用获取参数,我希望它对右值和左值引用有不同的作用。 (我还应该提到foo()
尊重常量;它不会改变引用的值。)我知道如果我写:
template <typename T> foo(T&& x);
我已经宣布了转发参考,而不是右值引用,意思是这样:
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 左值引用重载和一个非常量右值引用重载,那么您只需向转发引用案例添加一个约束:
template <typename T> void foo(T const& ) { ... }
template <typename T, REQUIRES(!std::is_reference<T>::value)>
void foo(T&& ) { ... }
where REQUIRES
是您选择的方法。现在,对于我们的四种情况:
- 非常量,左值:只有第一个可行
- const 左值:只有第一个可行
- 非常量,右值:两者都可行,第二个更匹配
- const rvalue: both viable, 2nd is
more specialized better match
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)