将 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 限定符重载 foo
会更好?或者是否有任何 "even more universal" 参考,这将有助于摆脱 const_cast
?
这在 std::tuple<Ts...> &&
之前无法工作 不是 转发引用,它是一个简单的右值引用,并且您不能将 const 左值引用绑定到右值-ref - 将您的代码更改为:
template<typename Tuple>
void foo(Tuple&& t) {
processFoo(std::forward<Tuple>(t));
}
并且您将拥有一个真正的转发引用,并且您的代码将起作用。
我有一个接受右值引用的函数:
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 限定符重载 foo
会更好?或者是否有任何 "even more universal" 参考,这将有助于摆脱 const_cast
?
这在 std::tuple<Ts...> &&
之前无法工作 不是 转发引用,它是一个简单的右值引用,并且您不能将 const 左值引用绑定到右值-ref - 将您的代码更改为:
template<typename Tuple>
void foo(Tuple&& t) {
processFoo(std::forward<Tuple>(t));
}
并且您将拥有一个真正的转发引用,并且您的代码将起作用。