代码之家  ›  专栏  ›  技术社区  ›  Language Lawyer

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

  •  2
  • Language Lawyer  · 技术社区  · 5 年前

    假设我有两个tu,其中有两个具有外部链接的非内联函数定义,它们的返回类型不同。
    我的程序违反了哪一段?
    [basic.def.odr]/4

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

    但是

    1. 这一段说 可能是,也可能不是。
    2. 毕竟,如果我在不同的TUs中定义了相同的非内联函数,该如何判断呢? [over.dcl]/1 谈论同样的范围。
    1 回复  |  直到 5 年前
        1
  •  5
  •   Barry    5 年前

    我相信你在寻找: [basic.link]/10 :

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

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

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

    [defns.signature] :

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

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


    一般来说,标准中关于范围和名称查找的所有讨论都是非常糟糕的,直到Davis“我们不配得到的英雄”Herring的工作完成。