跨翻译单元不一致的模板专业化状态?

And*_*zos 4 c++ language-lawyer c++20

请考虑以下程序:

档案啊

template <typename T> struct C { static constexpr int x = 42; };
Run Code Online (Sandbox Code Playgroud)

文件 BH

#include "A.H"

template <> struct C<int> { static constexpr int x = 43; };
Run Code Online (Sandbox Code Playgroud)

文件 A.CC

#include "A.H"

void a() { std::cout << C<int>::x; }
Run Code Online (Sandbox Code Playgroud)

文件 B.CC

#include "B.H"

void b() { std::cout << C<int>::x; }
Run Code Online (Sandbox Code Playgroud)

文件主.CC

void a(); void b();

int main() { a(); b(); }
Run Code Online (Sandbox Code Playgroud)

这个程序的状态如何?它是格式错误的,格式错误的,不需要诊断,是否表现出未定义的行为,或者以上都没有(没关系)?

如果以上都不是,程序的输出是什么?

如果是上述之一,它违反了什么规则?

(此外,如果 BH 包含部分专业化而不是显式专业化,答案会有所不同吗?)

Bar*_*rry 7

这是[temp.arg.template]/2

如果特化在实例化时不可见,并且如果它可见就会被选中,则程序格式错误,不需要诊断。

的特化C<int>在 的定义中不可见a(),但如果它已经被选中,就会被选中。


但更重要的是,这是打油诗(我的间距):

在编写专业时,
要注意它的位置;
或者让它编译
将是一种
点燃它自焚的试验。