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

2024-03-26

假设我有 2 个 TU,其中有 2 个具有外部链接的非内联函数定义,其区别仅在于返回类型。
我的程序违反了哪一段?
[基本.def.odr]/4 https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#4 says:

每个程序都应包含在该程序中在废弃语句之外使用的每个非内联函数或变量的精确定义;无需诊断。

But

  1. 这一段说“这是 ODR 使用的”情况可能是这样,也可能不是。
  2. 毕竟,如何判断我是否在不同的 TU 中定义了相同的非内联函数?[over.dcl]/1 https://timsong-cpp.github.io/cppwp/n4659/over.dcl#1谈论相同的范围。

我相信您正在寻找:[基本.链接]/9 https://eel.is/c++draft/basic.link#9:

两个相同的名称([basic.pre])并且在不同作用域中声明的两个名称应表示相同的变量、函数、类型、模板或命名空间,如果

  • 两个名称都具有外部或模块链接,并且在附加到同一模块的声明中声明,或者两个名称都具有内部链接,并且在同一翻译单元中声明;和
  • 两个名称都引用同一名称空间的成员或同一类的非继承成员;和
  • 当两个名称都表示函数或函数模板时,签名([defns.signature],[defns.signature.template])相同。

如果具有外部链接的多个同名声明将声明同一实体,但它们附加到不同的模块,则该程序是格式错误的;无需诊断。 [ 注意:using 声明、typedef 声明和别名声明不声明实体,而只是引入同义词。同样,using 指令不声明实体。 ——尾注]

And [基本.链接]/11 https://eel.is/c++draft/basic.link#11:

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

And [定义签名] https://eel.is/c++draft/defns.signature:

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

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


一般来说,在 Davis“我们不值得的英雄”Herring 的工作完成之前,标准中所有关于范围和名称查找的讨论都相当糟糕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐