作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习 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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!