![](/img/trans.png)
[英]Passing rvalue reference to const lvalue reference paremeter
[英]Passing a const lvalue reference as rvalue reference
我有一个接受右值引用的函数:
template<typename... Ts>
void foo(std::tuple<Ts...>&& t)
{
processFoo(std::forward<std::tuple<Ts...>>(t));
}
另一个接受左值引用的函数:
template<typename T>
void bar(const T& t);
我希望bar
能够同时绑定左值和右值,因此它的签名还可以。 然后,我想从bar用t
调用foo
。 对于此代码:
template<typename T>
void bar(const T& t);
{
foo(t);
}
我的编译器正确地抱怨没有匹配函数可以调用foo(...)
,因为std::tuple<_blahblahblah>
和const std::tuple<_blah>
具有不兼容的cv限定词。 因此,我执行以下操作:
template<typename T>
void bar(const T& t);
{
foo(std::forward<T>(const_cast<T&>(t)));
}
但是const_cast
看起来是一种解决方法!
上面的转发代码看起来正常吗? 也许为其他引用类型和cv-qualifiers重载foo
会更好? 还是有任何“甚至更通用”的引用,这将有助于摆脱const_cast
?
在std::tuple<Ts...> &&
不是转发引用之前,它不能工作,它是一个简单的右值引用,您不能将const左值引用绑定到右值引用-将代码更改为:
template<typename Tuple>
void foo(Tuple&& t) {
processFoo(std::forward<Tuple>(t));
}
您将获得真正的转发参考,并且您的代码将正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.