2017-10-09 213 views
1

最近,我正在与学生讨论限制类型的可能性使用转发引用。我知道通过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);    
}      

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

UPDATE

我也有点困惑的格式的显式实例化(<int>(int&&)<int&>(int&)),但我想它是由模板演绎给出的,也许是引用崩溃规则。

回答

1

这没关系,它是portable/standard-compliant

这就是所谓的模板专业化,你可以阅读更多关于这个话题here

模板专业化是写一个特别的处理特定调用。 在你的代码中,你有两个专业。 第一个接收右值引用(例如像5的整数文字)并返回int

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

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