繁体   English   中英

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

[英]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 包含部分专业化而不是显式专业化,答案会有所不同吗?)

这是[temp.arg.template]/2

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

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


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

写专业的时候,
小心它的位置;
或者让它编译
将是这样的审判
以点燃它的自焚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM