【问题标题】:Identity of function template instantiation in multiple translation units多个翻译单元中函数模板实例化的标识
【发布时间】:2015-10-01 03:38:29
【问题描述】:

根据cppref,多个翻译单元中inline函数的身份特征如下:

...

2) 在每个翻译单元中都有相同的地址。

3) 所有函数定义中的函数局部静态对象都是 在所有翻译单元之间共享(它们都引用同一个对象 在一个翻译单元中定义)

...

简单来说,隐含了单例身份。

我想知道这是否同样适用于没有 inline 说明符的函数模板实例化。

【问题讨论】:

  • 你的意思是 explicit 模板实例化吗?一个小的代码示例会有所帮助。

标签: c++ templates inline language-lawyer one-definition-rule


【解决方案1】:

我想知道这是否同样适用于没有内联说明符的函数模板实例化。

这同样适用于模板。见§3.2 一个定义规则:

  1. 类类型(第 9 条)、枚举类型(7.2)、带有外部链接的内联函数(7.1.2)、类模板(第 14 条)、非静态函数可以有多个定义模板 (14.5.6)、类模板的静态数据成员 (14.5.1.3)、类模板的成员函数 (14.5.1.1) 或未指定某些模板参数的模板特化 (14.7, 14.5.5) 在程序中,前提是每个定义出现在不同的翻译单元中,并且定义满足以下要求。 ... 如果 D 是一个模板并且在多个翻译单元中定义,则上述要求应适用于模板定义 (14.6.3) 中使用的模板封闭范围的名称,也适用于依赖实例化点的名称(14.6.2)。如果 D 的定义满足所有这些要求,那么程序的行为就好像有一个 D 的定义。 如果 D 的定义不满足这些要求,那么行为是未定义的。

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多