背景
在 C++03 中,用作模板参数的符号必须具有外部链接;如上一个问题所述,此限制在 C++11 中已删除:
在 C++03 中,模板参数不能有内部链接:
[C++03: 14.6.4.2/1]:
对于依赖于模板参数的函数调用,如果函数名称是unqualified-id但不是template-id,则使用通常的查找规则(3.4.1、3.4.2)找到候选函数,但以下情况除外:
- 对于使用非限定名称查找(3.4.1) 的查找部分,只能找到具有来自模板定义上下文的外部链接的函数声明。
- 对于使用关联命名空间 (3.4.2) 的查找部分,仅找到在模板定义上下文或模板实例化上下文中找到的具有外部链接的函数声明。
[..]
这在 C++11 中已更改(问题#561:“依赖名称查找中的内部链接函数” ):
[C++11: C.2.6]:
14.6.4.2
更改:允许具有内部链接的函数的依赖调用
理由:过度约束,简化重载决议规则。导致:
[C++11: 14.6.4.2/1]:
对于依赖于模板参数的函数调用,使用通常的查找规则(3.4.1、3.4.2、3.4.3)找到候选函数,除了:
- 对于使用非限定名称查找(3.4.1) 或限定名称查找 (3.4.3) 的查找部分,只能找到来自模板定义上下文的函数声明。
- 对于使用关联命名空间 (3.4.2) 的查找部分,只能找到在模板定义上下文或模板实例化上下文中找到的函数声明。
[..]
(发现缺少的“与外部联系”资格。)
问题 #561(“依赖名称查找中的内部链接函数”),导致在 C++11 中删除限制的提议,要求:
此外,真的有必要从查找中排除内部链接功能吗?ODR 是否为实现提供了足够的自由度来处理这种情况,而不会在名称查找上出现另一个问题?
随着后来的答案:
该小组的共识是[..]内部链接函数应该通过查找找到(尽管如果通过重载决议选择它们可能会导致错误)。
问题
限制的最初实际理由是什么?
似乎必须有一个,因为最初的标准措辞已将查找限制为具有外部链接的符号。
仅仅是“[内部链接功能]如果通过重载解决方案选择可能会导致错误”,并且通过 2000 年代的观点转移了这有多重要?还是其他地方发生了变化,也许是其他地方针对不同 C++11 特性的新措辞的间接后果?