将 const 左值引用作为右值引用传递

Ser*_*gey 3 c++ templates constants const-cast perfect-forwarding

我有一个接受右值引用的函数:

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

和另一个接受左值引用的函数:

template<typename T>
void bar(const T& t);
Run Code Online (Sandbox Code Playgroud)

我希望bar能够同时绑定左值和右值,所以它的签名是可以的。然后,我想打电话foot从酒吧。对于此代码:

template<typename T>
void bar(const T& t);
{
    foo(t);
}
Run Code Online (Sandbox Code Playgroud)

我的编译器正确地抱怨没有匹配的函数调用foo(...), asstd::tuple<_blahblahblah>并且const std::tuple<_blah>具有不兼容的 cv 限定符。所以我执行以下操作:

template<typename T>
void bar(const T& t);
{
    foo(std::forward<T>(const_cast<T&>(t)));
}
Run Code Online (Sandbox Code Playgroud)

const_cast看起来像是一种解决方法!

上面的转发代码看起来正常吗?也许重载foo其他引用类型和 cv 限定符会更好?或者是否有任何“更普遍”的参考资料,这将有助于摆脱const_cast

Hol*_*olt 5

这不能工作之前std::tuple<Ts...> &&不是转发引用,它是一个简单右值引用,你不能绑定一个const左值裁判一个右值-REF -改变你的代码:

template<typename Tuple>
void foo(Tuple&& t) {
    processFoo(std::forward<Tuple>(t));
}
Run Code Online (Sandbox Code Playgroud)

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