![](/img/trans.png)
[英]How does the linker handle identical template instantiations across translation units?
[英]Status of inconsistent template specializations across translation units?
请考虑以下程序:
档案啊
template <typename T> struct C { static constexpr int x = 42; };
文件 BH
#include "A.H"
template <> struct C<int> { static constexpr int x = 43; };
文件 A.CC
#include "A.H"
void a() { std::cout << C<int>::x; }
文件 B.CC
#include "B.H"
void b() { std::cout << C<int>::x; }
文件主.CC
void a(); void b();
int main() { a(); b(); }
这个程序的状态如何? 它是格式错误的,格式错误的,不需要诊断,是否表现出未定义的行为,或者以上都没有(没关系)?
如果以上都不是,程序的输出是什么?
如果是上述之一,它违反了什么规则?
(此外,如果 BH 包含部分专业化而不是显式专业化,答案会有所不同吗?)
如果特化在实例化时不可见,并且如果它可见就会被选中,则程序格式错误,不需要诊断。
C<int>
在a()
的定义中不可见,但如果它已经被选中,就会被选中。
但更重要的是,这是打油诗(我的间距):
写专业的时候,
小心它的位置;
或者让它编译
将是这样的审判
以点燃它的自焚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.