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

时间:2017-10-09 08:13:15

标签: c++ templates explicit-instantiation forwarding-reference

最近,我正在与学生讨论使用转发参考 限制模板类型的可能性。我知道按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&);

main.cpp中:

#include "f.h"      

int main() { 
   f(1);              
// f('1'); // LINKER ERROR   

   int i = 2;         
   f(i);              
}                     

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

更新

我对显式实例化的格式(<int>(int&&)<int&>(int&))也有点困惑,但我猜它是由模板推导和可能引用折叠规则给出的。

1 个答案:

答案 0 :(得分:1)

这没关系,便携/标准兼容

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

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

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

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