其他分享
首页 > 其他分享> > c – 需要在完美转发中衰减

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