gpt4 book ai didi

c++ - 令人困惑的 C++ 模板

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:49 24 4
gpt4 key购买 nike

我正在学习 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com