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打印參數。