c++ - 跨翻译单元的模板专业化不一致的状态?
问题描述
请考虑以下程序:
档案啊
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()
,但如果是的话就会被选中。
但更重要的是,这是打油诗(我的间距):
编写专业时,
请注意其位置;
或者让它编译
将是一种试炼
,以点燃它的自焚。
推荐阅读
- python - Python(matplotlib):在网格中排列多个子图(直方图)
- flutter - 试图将图标按钮包装到容器中,但它不起作用
- reactjs - 将列表隐藏到另一个具有新属性名称的新列表中
- sqlite - Sqlite 使用 fts5 表代替主表来执行所有查询
- flutter - 尝试使用 DefaultTabController.of(context).index 获取 currentTab 但在更改选项卡时当前选项卡始终显示为 0
- typescript - Next.js - 将调用堆栈映射到 .ts 文件
- python - 从列表中的多个字典中获取字典值
- assembly - 获取用户字符串输入并以整数形式重新打印。ATT大会
- arrays - 在数组中添加多个元素
- javascript - 如何确定mxgraph中连接的哪一侧