成员函数模板是否需要“内联”

时间:2012-10-02 13:09:04

标签: c++ templates

如果我在非模板类中有成员函数模板并想在类外定义它 - 我是否必须使用“内联”?

示例:

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 基本上被忽略用于优化,但允许在不同的翻译单元中对函数进行多个定义,这隐含地转换为将这些函数导出为弱符号。这是否意味着声明模板,因为内联是多余的?

2 个答案:

答案 0 :(得分:0)

成员函数模板是否为函数模板,它们当然不是对象或非内联函数,因此单定义规则不适用。

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

答案 1 :(得分:0)

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

您可能希望为函数模板提供此提示,从而标记内联的函数模板定义。如果您不想提供该提示,则不需要内联。

(现在已经过了一段时间,当时只考虑标记为内联的函数进行优化,但关键字还没有达到register的命运,即编译器通常忽略它的正式含义除外阻止获取变量的地址。)