繁体   English   中英

传递const左值参考作为右值参考

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM