我想防止编译器使用extern template
.
以下片段按预期工作(static_assert
不触发):
template<typename T>
void f() {
static_assert(sizeof(T) == 0, "f()");
};
extern template void f<int>();
void g() {
f<int>();
}
但是有了这个,编译器似乎试图实例化模板函数,因为static_assert
确实触发了:
struct S {
template<typename T>
void f() {
static_assert(sizeof(T) == 0, "S::f()");
}
};
extern template void S::f<int>();
void g() {
S s;
s.f<int>();
}
有了这个,static_assert
也会触发,而我希望它不会:
template<typename T>
struct S {
S(){};
static_assert(sizeof(T) == 0, "S");
};
extern template struct S<int>;
void g() {
S<int> s;
}
在我的实际情况中,我想加快编译时间,但我观察到编译有 的翻译单元,extern template ...
与这些模板相关的符号不会出现在.o
文件中(用 看nm
),但它们实际上是编译的。 ..(我通过使用 clang-ftime-trace
和 with观察重要的编译时间来检查这一点templight++
)。
为什么似乎extern template
没有按预期工作?
谢谢!