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

时间:2019-05-09 16:39:06

标签: c++ static language-lawyer linkage one-definition-rule

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)准确地包含在该程序中奇特使用的每个非内联函数或变量的一个定义;无需诊断。

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  

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

     

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

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