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

标签 c++ templates struct rvalue-reference typename

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

相关文章:

c - 语义版本控制 : minor or major change?

c++ - 怎么能不对 C++ 结构布局做出假设呢?

c++ - 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440

c# - C++ 与 C# 相比,计算速度提高了 15 倍,这是合法的吗?

c++ - 从 GetAdaptersAddresses() 获取子网掩码

c++ - 重载运算符不抛出异常

ruby-on-rails - Rails 3.1 共享客户端/服务器模板,支持 i18n

xcode - 任何人都在 Xcode 4 模板中使用 Copy Files 构建阶段取得了成功

json - 如何解析字符串以进行结构化并写入文件

c++ - 如何在VSCODE中调试带有 "sudo"的程序