C++ 如何编写转发函数模板?

C++ 如何编写转发函数模板?,c++,perfect-forwarding,C++,Perfect Forwarding,我想进一步了解std::forward如何工作,以及显式模板参数和模板参数推断如何与转发引用一起工作,我尝试了以下示例: template <typename T> T&& fwd_(typename std::remove_reference<T>::type& arg){ std::cout << "fwd_(type&)\n"; return static_cast<T&&

我想进一步了解
std::forward
如何工作,以及显式模板参数和模板参数推断如何与转发引用一起工作,我尝试了以下示例:

template <typename T>
T&& fwd_(typename std::remove_reference<T>::type& arg){
    std::cout << "fwd_(type&)\n";
    return static_cast<T&&>(arg);
}

template <typename T>
T&& fwd_(typename std::remove_reference<T>::type&& arg){
    std::cout << "fwd_(type&&)\n";
    ++arg;
    return static_cast<T&&>(arg);
}

int main(){

    int&& l = fwd_<int>(5);
    int&& m = fwd_<int&&>(7);
    int& j = fwd_<int&>(m);
    int& k = fwd_<int&>(7); // UB?
    std::cout << k << std::endl;

  std::cout << '\n';
}
模板
T&fwd(类型名称std::删除\引用::类型和参数){
标准::cout
我不知道k发生了什么事?我怎么能把r值作为l值传递呢?
(fwd_7))

是的,这是危险的,因为
T
int&
并且返回值
T&&
,这是我们得到
int&&
int&
,即返回对临时变量的引用,该变量没有延长使用寿命,因此在完整表达式末尾销毁临时变量后会导致UB(

为此,C++标准明确地从“代码> STD::前进/<代码>:

使用此用法
模板constepr T&forward(删除引用)无例外;

template constepr T&&forward(删除引用)无例外;

3备注:如果第二个表单用左值实例化 引用类型,程序格式不正确。

例如,在这种情况下,libstdc++有一个早期故障:

  template<typename _Tp>
    constexpr _Tp&&
    forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
    {
      static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
            " substituting _Tp is an lvalue reference type");
      return static_cast<_Tp&&>(__t);
    }
模板
constexpr\u Tp&&
转发(typename std::remove_reference::type&&__t)无例外
{
静态断言(!std::is\u左值\u引用::值,“模板参数”
“替换_Tp是左值引用类型”);
返回静态\u cast(\uu t);
}