繁体   English   中英

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

[英]Non-overloadable non-inline function definitions in different translation units

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

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

  1. 这一段说“这是 odr 使用的” ,这可能是也可能不是。
  2. 毕竟,我如何判断我是否在不同的 TU 中定义了相同的非内联函数? [over.dcl]/1谈论相同的范围。

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

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

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

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

[basic.link]/11

在所有类型调整后(在此期间 typedef 被它们的定义替换),所有引用给定变量或函数的声明所指定的类型应该是相同的,除了数组对象的声明可以指定不同的数组类型缺少主数组绑定([dcl.array])。 在类型标识上违反此规则不需要诊断。

[defns.signature]

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

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


一般来说,标准中所有关于范围和名称查找的讨论都被打破了,直到戴维斯“我们不配拥有的英雄”赫林的工作通过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM