任何东西怎么可能绑定到这个前向函数?
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
这是左值作为命名变量。
我想我已经非常接近于理解这一点了。 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
这是左值作为命名变量。