首页 > 解决方案 > 跨翻译单元的模板专业化不一致的状态?

问题描述

请考虑以下程序:

档案啊

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++language-lawyerc++20

解决方案


这是[temp.arg.template]/2

如果一个特化在实例化时是不可见的,并且如果它是可见的就会被选中,那么程序是不正确的,不需要诊断。

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


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

编写专业时,
请注意其位置;
或者让它编译
将是一种试炼
,以点燃它的自焚。


推荐阅读