c – 需要在完美转发中衰减
作者:互联网
我不明白为什么以下代码无效.
#include <type_traits>
#include <tuple>
template<typename... Ts>
void funka( std::tuple<Ts...>&& v ) {
}
template<typename T>
void funkb( T&& v ) {
funka( std::forward<T>( v ) );
}
void funk() {
auto tup = std::tuple<int,int>( 1, 2 );
funkb( tup );
}
它失败并出现此错误:
<source>: In instantiation of 'void funkb(T&&) [with T = std::tuple<int, int>&]':
<source>:24:16: required from here
<source>:10:10: error: cannot bind rvalue reference of type 'std::tuple<int, int>&&' to lvalue of type 'std::tuple<int, int>'
funka( std::forward<T>( v ) );
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
如果我带着腐烂前进,它会编译.
template<typename T>
void funkb( T&& v ) {
funka( std::forward<std::decay_t<T>>( v ) );
}
所以问题是.为什么这不是有效的代码?对我而言,似乎funkb和funka的结果参数类型是相同的.
提前致谢
解决方法:
Why is that not valid code?
在funkb(tup)调用中,tup是一个左值.由于转发参考演绎规则,funka中参数v的类型推导为std :: tuple< int,int>&.
std :: forward< std :: tuple< int,int>&>(v)不移动v – 它仍然是左值.
左值不绑定到右值参考.
It compiles if I forward with a decay.
std :: decay_t删除所有cv限定符和引用.它将您的前向调用更改为:std :: forward< std :: tuple< int,int>>(v).
当使用非引用或右值引用作为其模板参数调用std :: forward时,它将移动v.
标签:perfect-forwarding,c 来源: https://codeday.me/bug/20190727/1549392.html