模板函数应该是静态的

Should template functions be static?

本文关键字:静态 函数      更新时间:2023-10-16

我经常在源文件中声明实用程序函数,以便将它们static内部链接。现在我有一个包含许多模板函数的头文件(在命名命名空间中)。我应该将它们也设置为静态以避免链接错误还是模板函数的行为不同?

模板函数是隐式inline的(注意:不是它们的显式专用化)。因此,您不会遇到与同一函数的多个定义相关的链接器错误。实际上,inline现在主要被视为链接器指令,防止违反ODR。

理由

如果您考虑一下,隐式禁用函数模板的 ODR 冲突是最有意义的。

编译器在看到函数模板的定义时不会实例化函数模板,而是在使用函数模板时实例

化:只有当使用函数模板时,编译器才知道要在模板参数中替换哪些参数。

为了能够实例化函数,编译器需要在调用站点查看函数模板定义,因此所述定义通常保存在声明函数模板的同一标头中。由于这是一种常见的用法,因此将函数模板隐式标记为内联可以节省一些键入!

static

关于static关键字:当应用于非成员函数时,它将为您提供内部链接:该方法仅在定义它的编译单元中可用。

遵循函数模板的常用方法(在标头中提供定义以及声明),使它们static没有什么优势:函数定义应该在每个看到函数声明的翻译单元中可用。