在试图弄清楚我对存储类的想法时,我写了以下片段:
#include <iostream>
template<typename T> T pi;
template<> extern int pi<int>;
int main() {
std::cout << pi<int> << '\n';
}
gcc 给了我一个编译错误
explicit template specialization cannot have a storage class
,我无法与之关联,例如,cppreference 存储类说明符。
clang 编译,但在链接上给了我一个“未定义的引用”错误,如果我用以下命令初始化变量,该错误就会消失:
template<> extern int pi<int>{3};
extern
变量的警告(如果我猜对了,这将是一个非模板变量的简单错误)
msvc 眨眼就编译和链接。
哪个编译器是正确的(如果有),为什么?
注意,在实际代码中我会进行专业化
inline constexpr
GCC 的诊断是正确的,根据 [temp.expl.spec]/2:
显式专业化不得使用
thread_local
以外的存储类说明符。