为什么“静态”功能在不同的tu中不会破坏ODR

Why `static` functions in different TUs do not break the ODR?

本文关键字:tu ODR 静态 功能 为什么      更新时间:2023-10-16

ODR允许我们定义几倍相同的内联函数(有一些限制(。

但是,static功能的简单情况如何?

// First TU
static int foo() { return 0; }
int bar1() { return foo(); }
// Second TU
static int foo() { return 1; }
int bar2() { return foo(); }

如果我们快速阅读[basic.def.odr] P4,我们可以天真地得出结论,这将是ub:

每个程序应完全包含一个在该程序之外使用的每个非内部函数或变量的定义(9.4.1(;无需诊断。

在何处指定每个foo是一个不同的函数,因此即使它们具有相同的名称,也不会破坏ODR?

这仅仅是读取[basic.link] p2.2的问题(即由于内部链接,名称不参考相同的实体,因此[basic.def.odr] p4在这里不适用(?或者是否有更多的细微差别/规则来确定此决定(例如[Basic.Scope]中的某些内容(?

请注意,对于未命名的名称空间,结果很明确,因为名称已经不同/唯一。

正确—即使在本地具有相同的名称,这些功能/实体是没有违规的两个。

[basic.link]/4.3:当名称具有内部链接时,它表示它表示的实体可以由同一翻译单元中其他范围的名称引用。

[basic.link]/5:具有名称空间范围的名称具有内部链接,如果它是变量,可变模板,函数或功能模板的名称,该名称被明确声明为static;或 [..]

我找不到适用的其他措辞(规范或其他方式(,但我认为我们不需要任何东西。