将const lvalue参考作为rvalue参考

Passing a const lvalue reference as rvalue reference

本文关键字:参考 rvalue lvalue const      更新时间:2023-10-16

我具有接受rvalue参考的函数:

template<typename... Ts>
void foo(std::tuple<Ts...>&& t)
{
    processFoo(std::forward<std::tuple<Ts...>>(t));
}

以及接受LVALUE参考的另一个功能:

template<typename T>
void bar(const T& t);

我希望 bar能够与lvalues和rvalues绑定,因此可以签名。然后,我想从bar调用foo调用CC_2。对于此代码:

template<typename T>
void bar(const T& t);
{
    foo(t);
}

我的编译器正确地抱怨foo(...)没有匹配功能,因为std::tuple<_blahblahblah>const std::tuple<_blah>具有不兼容的CV-Qualifiers。所以我做以下操作:

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...> &&不是转发参考之前无法工作的,这是一个简单的rvalue-Reference,并且您不能将const lvalue-ref绑定到rvalue-参考 - 将代码更改为:

template<typename Tuple>
void foo(Tuple&& t) {
    processFoo(std::forward<Tuple>(t));
}

您将有一个真正的转发参考,您的代码将起作用。