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

时间:2015-12-10 11:47:48

标签: c++ templates c++11 language-lawyer

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!)包含建议,以完全删除上面引用的句子,以及链接规则的一般合理化。

1 个答案:

答案 0 :(得分:4)

  

&#34;可以&#34;在规范中指出源代码控制链接(例如通过命名空间{})或者允许编译器选择实例化是否具有内部或外部链接?

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

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

相关问题