显式模板实例化和转发引用

Explicit template instantiation and forwarding references

本文关键字:转发 引用 实例化      更新时间:2023-10-16

最近,我和学生讨论了限制使用转发引用模板类型的可能性。我知道通过is_samestatic_assertenable_if一起比较类型,但我们也讨论了显式模板实例化

以下示例适用于我 GCC:

F.H:

template <typename T>              
void f(T&& param); // declaration  

f.cpp:

#include <iostream>
template <typename T>
void f(T&& param) { std::cout << param << std::endl; }
// explicit instantiations:
template void f<int>(int&&);
template void f<int&>(int&);

主.cpp:

#include "f.h"      
int main() { 
   f(1);              
// f('1'); // LINKER ERROR   
   int i = 2;         
   f(i);              
}                     

我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否可移植/符合标准。(请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。

更新

我也对显式实例化的格式(<int>(int&&)<int&>(int&))有点困惑,但我想它是通过模板推导和参考折叠规则给出的。

这没关系,它是可移植的/符合标准的

这称为模板专用化,您可以在此处阅读有关此主题的更多信息

模板专用化是为特定调用编写特定的处理程序。在您的代码中,您有两个专用项。第一个接收一个右值引用(例如像 5 这样的整数文本)并返回一个int

第二个接收一个左值引用(例如,int an 类型的变量 b 的值为 5)并返回一个左值引用。

默认情况下,您尝试使用 std::stringstream 打印参数。