任何东西怎么可能绑定到这个前向函数?

How can anything possibly bind to this forward function?

我想我已经非常接近于理解这一点了。 forward 函数似乎有两个重载,我认为需要两个重载才能使其工作,但据我所知,其中一个完全没用,它只适用于一个:

template <typename T>
T&& forward(T&& arg)
{// Never gets called.
    // I can't see how since every argument from another function is always
    // an lvalue, nothing can bind to it
    return static_cast<T&&>(arg); 
}

template <typename T>
T&& forward(T& arg)
{// Just this one seems to do the job
    return static_cast<T&&>(arg);
}

template <typename Type>
void emplace(Type&& arg)
{
    forward<Type>(arg);
}

int main()
{
    int a = 0;
    int& intref = a;
    
    emplace(a);
    emplace(int());
}

都调用了一个forward函数,另一个可以去吧?

为了说明,您可以将代码更改为:

#include <iostream>

template <typename T>
T&& forward(T&& arg)
{   
    // gets called when the parameter is a rvalue reference
    std::cout << "called\n";
    return static_cast<T&&>(arg); 
}

template <typename T>
T&& forward(T& arg)
{
    return static_cast<T&&>(arg);
}

template <typename Type>
void emplace(Type&& arg)
{
    forward<Type>(forward<Type>(arg));
}

int main()
{
    emplace(int());
}

得到output:

called

emplace中调用forward<Type>(arg);不调用T&& forward(T&& arg)因为emplace中的arg不是右值引用,马虎地说,因为它有一个名字。您可以使用右值调用 void emplace(Type&& arg),但参数 arg 不是右值。实际上这就是首先需要 std::forward 的原因。

第一个重载用于转发右值(作为右值)。例如

forward<int>(0);

emplace 中,您正在转发 arg 这是左值作为命名变量。