在多个编译单元中包含模板代码,它是否总是在没有内联的情况下链接?

vso*_*tco 4 c++ linker templates

假设我有模板代码MyHeader.h,然后包含在2个编译单元中,A.cpp并且B.cpp.这两个文件然后实例化相同的模板函数,比如说f<int>();(后者定义非内联MyHeader.h).

据我所知,发生的事情如下.编译器生成的代码f<int>();在两个A.objB.obj,则类似器丢弃在连接阶段中的符号之一.

我的问题:这种做法总是"安全"吗?也就是说,是否会有抱怨重复符号的连接符?标准是否对此有所说明?如果是的话,我找不到任何解决方案来制作我的所有模板功能inline.

Col*_*mbo 7

这始终是安全的,并由ODR涵盖.§3.2/ 6:

在程序中可以有多个非静态函数模板(14.5.6)[...]的定义,前提是每个定义出现在不同的翻译单元中,并且定义满足以下要求.[...长列表...] 如果D满足所有这些要求的定义,那么行为就好像有一个单一的定义D.如果定义D不满足这些要求,那么行为是不确定的.

如果你写出合理的代码,我应该满足我跳过的需求列表.

  • @vsoftco是的,§3.2/ 5. (2认同)
  • @vsoftco对你来说,链接器不是一个坏问题吗? (2认同)