我经常在我的源文件中将实用程序函数声明为static
,以便在内部链接它们。现在我有一个包含许多模板函数的头文件(在命名空间中)。我是否应该将它们设置为静态以避免链接错误或模板函数的行为方式不同?
答案 0 :(得分:9)
模板函数隐式inline
(注意:不是它们的显式特化)。因此,您不会遇到与同一函数的多个定义相关的链接器错误。实际上inline
现在主要被视为链接器指令,防止违反ODR。
如果您考虑一下,隐式禁用功能模板的ODR违规最有意义。
编译器在看到它的定义时不会实例化一个函数模板,它在使用时会被实例化:只有在使用函数模板时,编译器才知道在模板参数中要替换哪些参数。
为了能够实例化该函数,编译器需要在调用站点看到函数模板 definition ,因此所述定义通常保存在声明函数模板的相同头文件中。 由于这是一个常见的用法,隐式将函数模板标记为内联可以节省一些输入!
static
关于static
关键字:当应用于非成员函数时,它将为您提供内部链接:该方法仅在编译单元中可用是定义。
按照通常的函数模板方法(在标题中提供声明旁边的定义),使它们static
没有什么优势:函数定义应该在每个看到函数声明的翻译单元中可用。