不同翻译单元中不可重载的非内联函数定义

Non-overloadable non-inline function definitions in different translation units

本文关键字:定义 函数 重载 翻译 单元      更新时间:2023-10-16

假设我有两个TU,其中有两个带有外部链接的非内联函数定义,它们的返回类型不同
我的程序违反了哪些段落
[basic.def.odr]/4表示:

每个程序都应包含每个非内联函数或变量的一个定义,该函数或变量在该程序中使用,而不是丢弃的语句;无需诊断。

但是

  1. 这段话说"这是odr使用的">可能是也可能不是
  2. 毕竟,如果我在不同的TU中定义了相同的非内联函数,我该如何判断?[over.dcl]/1谈到了相同的范围

我相信您正在寻找:[basic.link]/9:

如果,两个相同的名称(〔basic.pre〕(和在不同范围中声明的名称应表示相同的变量、函数、类型、模板或命名空间

  • 这两个名称都有外部或模块链接,并在附加到同一模块的声明中声明,或者这两个名字都有内部链接并在同一翻译单元中声明;以及
  • 两个名称都指同一命名空间的成员,或者指同一类的成员,而不是通过继承;以及
  • 当两个名称都表示函数或函数模板时,签名([dfns.signature]、[dfns.signature.templ](是相同的

如果具有外部链接的同一名称的多个声明将声明同一实体,除非它们附加到不同的模块,则程序格式错误;不需要进行诊断。[注意:using声明、typedef声明和alias声明不声明实体,而只是引入同义词。同样,using指令也不声明实体。--end Note]

和[basic.link]/11:

在对类型进行所有调整后(在此期间,typedef被其定义所取代(,引用给定变量或函数的所有声明所指定的类型应相同,除了数组对象的声明可以指定因存在或不存在主数组绑定([dcl.array](而不同的数组类型。违反此类型标识规则不需要诊断。

And[defns.signature]:

⟨函数⟩名称、参数类型列表([dcl.fct](和封闭命名空间(如果有的话(

返回类型不是签名的一部分,因此您违反了相同签名意味着相同实体的规则。


一般来说,在Davis";《我们不配拥有的英雄》;赫林的工作顺利完成。