[英]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.