明确的模板实例化和转发引用
问题描述:
最近,我正在与学生讨论限制类型的可能性使用转发引用。我知道通过is_same
与static_assert
或enable_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&)
),但我想它是由模板演绎给出的,也许是引用崩溃规则。
答
这没关系,它是portable/standard-compliant。
这就是所谓的模板专业化,你可以阅读更多关于这个话题here
模板专业化是写一个特别的处理特定调用。 在你的代码中,你有两个专业。 第一个接收右值引用(例如像5的整数文字)并返回int
。
第二个接收一个左值引用(例如,类型为int的变量b的值为5)并返回一个左值引用。
在默认情况下,您试图使用std::stringstream
打印参数。