内联关键字对类成员模板函数的影响?

我已经了解了内联模板函数规范化here

除了在逻辑上的标头中要求使用inline关键字实例化之外,我找不到答案是否可以在标头中将非专用功能模板标记为inline吗?无论是成员函数还是普通函数。

请避免解释编译器如何比程序员更好地理解问题,问题是:inline关键字对标头中的“解压缩”模板有意义吗?

非专用模板是否始终内联,因为它们位于标题中?对于下面的示例伪代码,如果我们假设Foo::bar方法可能很长或很短,则省略inline关键字还是添加inline关键字会对内联或不内联的正确机会产生任何影响由编译器扩展功能?

以下是成员函数模板的示例,它反映了我的代码:

class Foo
{
public:
    template<typename Type>
    static Type bar();
};

非内联定义示例:

template<typename Type>
Type Foo::bar()
{
    return Type();
}

内联定义示例:

template<typename Type>
inline Type Foo::bar()
{
    return Type();
}

上面的这个inline关键字总是无用的,还是仅当编译器可以内联函数时才有意义?模板总是内联在标题中吗?

ni593010606 回答:内联关键字对类成员模板函数的影响?

inline关键字用于绕过One Definition Rule,而不用于指示函数调用的inline substitution。请注意,编译器仍然需要函数定义来执行内联替换,因此,如果函数的定义位于不同文件中包含的头文件中,则必须提供inline

专用功能模板类似于普通功能,因为所有模板参数均已固定(即,功能模板不能部分专用)。因此,如果(完全)专用功能模板位于头文件中,则应使其与inline一起处理“一个定义规则”,就像处理普通函数一样。

,

我想我找到了一些相关信息,并且看来inline 确实对标头IE中的模板定义有所不同。如果省略inline,则该函数不是内联的!

Reference link

报价:

  

作为示例,考虑包含以下内容的头文件Foo.h:   以下模板类。 请注意,方法Foo :: f()是内联的,   方法Foo :: g()和Foo :: h()不是。

// File "Foo.h"
template<typename T>
class Foo {
public:
  void f();
  void g();
  void h();
};
template<typename T>
inline
void Foo<T>::f()
{
  // ...
}

看起来我们可以安全地得出结论,模板不是隐式内联的,但是示例暗示在cpp文件中定义了其他2种方法,因此所有得出结论的选择都没有了。仍在寻找一些标准的确认。

,

它会影响显式实例化声明的行为(以鼓励实际内联函数模板内联的方式)。在C ++ 20的模块中,它还会影响使用内部的内部链接 eg static)实体的能力。模板,同样也旨在鼓励内联到进口商。在后一种情况下,将定义包含在类中不再将意味着inline

本文链接:https://www.f2er.com/3141510.html

大家都在问