我相信你在寻找:
[basic.link]/10
:
两个相同的名称([basic.pre])和在不同作用域中声明的名称应表示相同的变量、函数、类型、模板或命名空间,如果
-
两个名称都具有外部或模块链接,并在附加到同一个模块的声明中声明,或者两个名称都具有内部链接并在同一翻译单元中声明;以及
-
两个名称都是指同一名称空间的成员,或者是指同一类的成员,而不是继承;以及
-
当两个名称都表示函数或函数模板时,签名([defns.signature],[defns.signature.temp])是相同的。
如果具有外部链接的同一名称的多个声明将声明同一个实体,但它们附加到不同的模块,则程序格式错误;无需诊断。[注意:使用声明、typedef声明和alias声明并不声明实体,而只是引入同义词。类似地,using指令不声明实体。尾注]
[defns.signature]
:
¨函数名、参数类型列表([dcl.fct])和封闭命名空间(如果有)
返回类型不是签名的一部分,因此您违反了相同签名意味着相同实体的规则。
一般来说,标准中关于范围和名称查找的所有讨论都是非常糟糕的,直到Davis“我们不配得到的英雄”Herring的工作完成。