我已经阅读了有关内联模板函数规范化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
关键字总是无用的,还是仅当编译器可以内联函数时才有意义?模板总是内联在标题中吗?
inline
关键字用于绕过One Definition Rule,而不用于指示函数调用的inline substitution。请注意,编译器仍然需要函数定义来执行内联替换,因此,如果函数的定义位于不同文件中包含的头文件中,则必须提供inline
。
专用功能模板类似于普通功能,因为所有模板参数均已固定(即,功能模板不能部分专用)。因此,如果(完全)专用功能模板位于头文件中,则应将其inline
用作处理“一个定义规则”,就像处理普通函数时一样。
我想我已经找到了一些相关信息,并且看起来inline
does对于标题IE中的模板定义有所不同。如果省略inline
,则该函数不是内联的!
报价:
例如,考虑包含以下内容的头文件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()
{
// ...
}