模板函数应该是静态的
Should template functions be static?
我经常在源文件中声明实用程序函数,以便将它们static
内部链接。现在我有一个包含许多模板函数的头文件(在命名命名空间中)。我应该将它们也设置为静态以避免链接错误还是模板函数的行为不同?
模板函数是隐式inline
的(注意:不是它们的显式专用化)。因此,您不会遇到与同一函数的多个定义相关的链接器错误。实际上,inline
现在主要被视为链接器指令,防止违反ODR。
理由
如果您考虑一下,隐式禁用函数模板的 ODR 冲突是最有意义的。
编译器在看到函数模板的定义时不会实例化函数模板,而是在使用函数模板时实例化:只有当使用函数模板时,编译器才知道要在模板参数中替换哪些参数。
为了能够实例化函数,编译器需要在调用站点查看函数模板定义,因此所述定义通常保存在声明函数模板的同一标头中。由于这是一种常见的用法,因此将函数模板隐式标记为内联可以节省一些键入!
static
关于static
关键字:当应用于非成员函数时,它将为您提供内部链接:该方法仅在定义它的编译单元中可用。
遵循函数模板的常用方法(在标头中提供定义以及声明),使它们static
没有什么优势:函数定义应该在每个看到函数声明的翻译单元中可用。
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 方法的静态函数的等价性
- 扩展包含静态函数的类
- 非静态函数可以访问静态变量吗?
- 调用非静态函数作为谓词?