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

时间:2016-12-19 08:13:09

标签: c++ templates const perfect-forwarding const-cast

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

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能够与左值和右值绑定,因此它的签名是可以的。然后,我想从条形码foo拨打t。对于此代码:

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限定符重载foo会更好?或者是否有任何“更普遍”的参考,这将有助于摆脱const_cast

1 个答案:

答案 0 :(得分:4)

这在std::tuple<Ts...> && 转发引用之前无效,它是一个简单的右值引用,你不能将const lvalue-ref绑定到rvalue-ref - 更改你的代码:

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

您将获得真实的转发参考,您的代码将有效。