MSVC 链接器错误,通过代理初始化的命名空间中内联变量模板的显式专用化

MSVC linker error with explicit specialisation of inline variable template in namespace initialised via proxy

提问人:MC ΔT 提问时间:4/9/2022 最后编辑:MC ΔT 更新时间:4/9/2022 访问量:48

问:

请考虑以下 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
  • 的专业化是barinline
  • 的专业化是通过barproxy

鉴于奇怪的情况,我只能认为这是未定义的行为(虽然不知道这是如何发生的)或 MSVC 编译器/链接器的错误。这是怎么回事?

P.S. 请不要问我为什么需要写这样的奇怪代码......

C 模板 visual-c++ 链接器 错误

评论

4赞 user17732522 4/9/2022
构造不是必需的。如果初始值设定项不是常量表达式,则总是会发生错误,例如 具有相同的效果。proxyint f() { return 0; } /*...*/ template<> inline int foo::bar<int> = f();
0赞 273K 4/9/2022
如果它被移动到里面,则没有错误。namespace foo { template<> inline int bar<int> = proxy{} = 42; }

答: 暂无答案