繁体   English   中英

非成员函数模板何时具有内部链接?

[英]When does a non-member function template have internal linkage?

C ++ 11 draft,14.0.4:

非成员函数模板可以具有内部链接; 任何其他模板名称都应具有外部链接。

此查询是分离模板声明和定义的结果。 例如,我们可以在头文件中编写以下内容。

template <typename T>
bool operator==(T const & l, T const & r);

在单个源文件中,我们编写定义,注定要成为单个翻译单元。 对于类型foo ,我们也在同一个翻译单元中隐式或显式地实例化它。

template <typename T>
bool operator==(T const & l, T const & r)
{
  return extract(l) == extract(r); // extract is uninteresting
}

在第二个只能从头部看到定义的翻译单元中,我们尝试使用foo{} == foo{} ,即调用在其他地方实例化的operator==

目前,这“工作”。 链接器修补了两个翻译单元,正如我希望的那样。

但是,如果功能模板具有内部链接,则链接可能会失败。 例如,我们可以通过在匿名命名空间中实例化来强制执行此操作。

规范中的“can”是否表示源代码控制链接(例如,通过namespace {} )或者允许编译器选择实例化是否具有内部或外部链接?

我不相信这里有任何未定义的行为,但我很难说服自己所选择的链接不是实现细节。 我是否可以依赖其他翻译单元中可见的符号,如果它已在至少一个TU中被实例化,表明它将是外部的?

编辑: DR1603 (感谢Eugene Zavidovsky!)包含建议,以完全删除上面引用的句子,以及链接规则的一般合理化。

规范中的“can”是否表示源代码控制链接(例如,通过命名空间{})或者允许编译器选择实例化是否具有内部或外部链接?

这是控制链接的代码。 从函数模板生成的函数具有外部链接,除非它是static函数模板或模板在未命名的命名空间中(自C ++ 11起)。

换句话说,人们必须明确要求内部联系。

暂无
暂无

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

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