全局/命名空间范围内变量模板的存储类

问题描述 投票:0回答:1

在试图弄清楚我对存储类的想法时,我写了以下片段:

#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

c++ language-lawyer extern variable-templates
1个回答
0
投票

GCC 的诊断是正确的,根据 [temp.expl.spec]/2:

显式专业化不得使用thread_local以外的

存储类说明符

© www.soinside.com 2019 - 2024. All rights reserved.