【发布时间】:2017-10-09 08:13:14
【问题描述】:
最近,我正在与学生讨论模板类型限制使用转发引用的可能性。我知道通过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);
}
我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否可移植/符合标准。 (请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。)
更新
我对显式实例化的格式(<int>(int&&) 和<int&>(int&))也有些困惑,但我猜它是由模板推导给出的,可能是引用折叠规则。
【问题讨论】:
标签: c++ templates explicit-instantiation forwarding-reference