Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将常量左值引用作为右值引用传递_C++_Templates_Constants_Perfect Forwarding_Const Cast - Fatal编程技术网

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));
}