为什么“静态”功能在不同的tu中不会破坏ODR
Why `static` functions in different TUs do not break the ODR?
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
;或 [..]
我找不到适用的其他措辞(规范或其他方式(,但我认为我们不需要任何东西。
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 这是 basic.def.odr 部分的缺陷吗?
- 为什么显式模板实例化不会破坏 ODR?
- (ODR 使用问题)在不同文件中priority_queue名称相同的结构
- 将 Boost.Spirit.X3 解析器拆分为多个 TU
- 声明中不一致的no是否违反ODR?
- 是否使用静态 constexpr 变量 odr?
- 使用 -pthread 如何不违反 ODR 规则?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- C++ standard: ODR and constexpr std::string_view
- C++关于Tu和电视的参数D3DLVERTEX
- ODR 使用的规则不适用于 Visual Studio
- ASAN 检测与动态加载库共享的类的 vtable 的 ODR 违规
- C++模板函数的默认参数的 ODR 规则
- 为什么调用成员函数不调用该对象的 ODR-USE?
- 功能过载和ODR如何共存?(C )
- 2 个或更多 TU 中内联函数的多个定义
- 我可以在不同的 TU 中提供相同的函数定义吗?
- 为什么结构声明在C++中违反了 ODR
- 为什么“静态”功能在不同的tu中不会破坏ODR