成员函数模板"inline"需要

Is "inline" needed with member function templates

本文关键字:需要 inline 成员 函数模板      更新时间:2023-10-16

如果我在非模板类中有一个成员函数模板,并且想在类外定义它,我必须使用"inline"吗?

示例:

class A
{
template <class D>
void someMethod(D param);
}
template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}

该标准第3.2.5节规定,功能模板不属于一个定义规则。在这方面,成员函数模板是函数模板吗?

编辑:链接器在没有内联的情况下不会抱怨,但它仍然是有效的C++03吗?

编辑:

到目前为止,我学到了什么:gcc(以及其他编译器)将隐式模板实例化导出为弱符号,这意味着如果它们在多个翻译单元中实例化,则在链接时不会发生冲突。由于弱符号不是标准的一部分-标准是否以某种方式隐含地要求模板实例化以这种方式运行?我是否可以期待其他符合标准的编译器/链接器组合也有同样的行为?

由于内联在优化时基本上被忽略,但允许在不同的转换单元中对函数进行多个定义,这隐含地转换为将这些函数导出为弱符号。这是否意味着将模板声明为inline是多余的?

无论成员函数模板是否为函数模板,它们肯定不是对象或非内联函数,因此不适用"一个定义规则"。

但它们实际上是函数模板,并且对于非成员函数模板特定的标准的其他应用程序也是如此。

inline作为关键字向编译器建议,标记为这样的函数是具有相同名称的优化的良好候选者,为了帮助实现这种优化,它要求在每个使用函数的CU中以相同的方式定义函数(如果编译器看到代码,则更容易进行优化,即使链接器能够进行相同的优化,但20年前这还远不常见)。

您可能希望为函数模板提供此提示,从而在内联中标记函数模板定义。如果您不想给出这种提示,则不需要内联。

(曾经有一段时间,优化只考虑标记为内联的函数,但关键字还没有达到register的命运,即通常被编译器忽略,除非它的形式意义是防止获取变量的地址)。