C++ 将常量左值引用作为右值引用传递
我有一个接受右值引用的函数:C++ 将常量左值引用作为右值引用传递,c++,templates,constants,perfect-forwarding,const-cast,C++,Templates,Constants,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); 我的编译器理所当然地抱怨,调用foo(…)时没有匹配的函数,因为std
template<typename... Ts>
void foo(std::tuple<Ts...>&& t)
{
processFoo(std::forward<std::tuple<Ts...>>(t));
}
template<typename T>
void bar(const T& t);
我的编译器理所当然地抱怨,调用foo(…)
时没有匹配的函数,因为std::tuple
和const std::tuple
具有不兼容的cv限定符。因此,我做了以下工作:
template<typename T>
void bar(const T& t);
{
foo(std::forward<T>(const_cast<T&>(t)));
}
模板
空心钢筋(const T&T);
{
foo(std::forward(const_cast(t));
}
但是const_cast
看起来像是一个解决办法
上面的转发代码看起来正常且惯用吗?对于其他引用类型和cv限定符,是否最好重载
foo
?或者是否有任何“更通用”的引用,有助于摆脱常量转换
?这在std::tuple&&
不是转发引用之前是无法工作的,它是一个简单的右值引用,并且不能将常量左值引用绑定到右值引用-将代码更改为:
template<typename Tuple>
void foo(Tuple&& t) {
processFoo(std::forward<Tuple>(t));
}
模板
void foo(元组和&t){
processFoo(std::forward(t));
}
您将拥有一个真正的转发引用,您的代码将正常工作。
foo
不会修改其参数或获取其所有权。声明它也接受一个const
引用。我看没有理由在这里接受转发引用。std::tuple&&t
不是转发引用。@StoryTeller在实际代码中执行转发,所以我需要右值引用。我修改了代码示例。正如Hold指出的,我错过了,这根本不是转发参考。只是对std::tuple
的常规右值引用。同样,只需使用const
,或者完全放弃它。你实际上没有做任何转发。看起来很合理。谢谢
template<typename Tuple>
void foo(Tuple&& t) {
processFoo(std::forward<Tuple>(t));
}