提问人:MC ΔT 提问时间:4/9/2022 最后编辑:MC ΔT 更新时间:4/9/2022 访问量:48
MSVC 链接器错误,通过代理初始化的命名空间中内联变量模板的显式专用化
MSVC linker error with explicit specialisation of inline variable template in namespace initialised via proxy
问:
请考虑以下 C++:
struct proxy {
int operator=(int x) {
return x;
}
};
namespace foo {
template<typename T>
inline int bar = 0;
}
template<>
inline int foo::bar<int> = proxy{} = 42;
int main() {}
(现场示例:https://godbolt.org/z/j8Gqj8r39)
此代码仅在 MSVC 上导致以下链接器错误(GCC 和 Clang 正常):
error LNK2001: unresolved external symbol "int bar<int>" (??$bar@H@@3HA)
这很奇怪,因为只有 1 个翻译单元,所有符号都是完全定义的,甚至没有被访问。bar
该错误似乎仅在满足以下所有条件时才会发生:
bar
位于命名空间中bar
已模板化- 专业化是全球范围的
bar
- 的专业化是
bar
inline
- 的专业化是通过
bar
proxy
鉴于奇怪的情况,我只能认为这是未定义的行为(虽然不知道这是如何发生的)或 MSVC 编译器/链接器的错误。这是怎么回事?
P.S. 请不要问我为什么需要写这样的奇怪代码......
答: 暂无答案
评论
proxy
int f() { return 0; } /*...*/ template<> inline int foo::bar<int> = f();
namespace foo { template<> inline int bar<int> = proxy{} = 42; }