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

Aco*_*orn 3 c++ static one-definition-rule linkage language-lawyer

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

但是,简单的static函数情况又如何呢?

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

// Second TU
static int foo() { return 1; }
int bar2() { return foo(); }
Run Code Online (Sandbox Code Playgroud)

如果我们快速阅读[basic.def.odr] p4,我们可以天真的得出结论,那就是UB:

每个程序应准确地包含在该程序中被丢弃的语句之外的每个非内联函数或变量的一个定义(9.4.1);无需诊断。

在C ++标准中哪里指定了每个foo函数都是不同的函数,因此即使它们具有相同的名称,也不会破坏ODR?

仅仅是阅读[basic.link] p2.2的问题(即,由于内部链接,名称不指向同一实体,因此[basic.def.odr] p4在这里不适用)?还是做出决定时涉及更多细微差别/规则(例如[basic.scope]中的内容)?

请注意,使用未命名的名称空间,结果很明显,因为名称已经是不同的/唯一的。

Lig*_*ica 5

正确-尽管它们在本地具有相同的名称,但是它们是两个不同的功能/实体,因此没有冲突。

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

[basic.link]/5:如果名称空间是显式声明的变量,变量模板,函数或函数模板的名称,则具有名称空间范围的名称具有内部链接static;或[..]

我无法立即找到适用的其他措辞(规范性或其他方式),但我认为我们不需要任何措辞。