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 包含部分专业化而不是显式专业化,答案会有所不同吗?)
如果特化在实例化时不可见,并且如果它可见就会被选中,则程序格式错误,不需要诊断。
的特化C<int>在 的定义中不可见a(),但如果它已经被选中,就会被选中。
但更重要的是,这是打油诗(我的间距):
在编写专业时,
要注意它的位置;
或者让它编译
将是一种
点燃它自焚的试验。