我正在学习 C++ 模板。有人可以解释一下这段代码的每一点
template <class T>
struct identity
{
typedef T type;
};
template <class T>
T&& forward(typename identity<T>::type&& a)
{
return a;
}
最佳答案
template <class T>
struct identity
{
typedef T type;
};
这部分定义了一个名为 identity
的类模板拥有公共(public)成员 typedef
命名type
作为模板参数传递的类型。在您的示例中,没有部分或显式特化,因此传递给 identity
的任何类型是 type
.
template <class T>
T&& forward(typename identity<T>::type&& a)
{
return a;
}
forward
是一个函数模板,采用对identity<T>::type
返回的类型的右值引用。 type
返回的类型(无论多么明显)编译器无法将其推断为 T
(因为类型是 dependent type ),所以您必须显式指定 forward
的模板参数.
右值引用语法 &&
(对于返回类型)也表示(非正式地)称为通用引用,因为类型 T
是一个模板参数。这意味着返回类型可以绑定(bind)到函数返回的右值和左值。
参数类型identity<T>::type&&
不是通用引用,因为返回的类型不是模板参数。这意味着该参数只能接受右值。这将要求我们move
将左值写入参数 forward
:
int main()
{
int n{0};
forward<int>(std::move(n));
}
最后我们返回参数a
到右值引用。但请注意,将参数返回到 T&&
不起作用,因为 a
必须移动:
template <class T>
T&& forward(typename identity<T>::type&& a)
{
return std::move(a);
}
否则返回左值引用:
template <class T>
T& forward(typename identity<T>::type&& a)
{
return a;
}
关于c++ - 令人困惑的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16601774/