这不是无关紧要的。不,不是每个函数模板都是inline
默认的。该标准甚至在Explicit specialization ([temp.expl.spec])中对此进行了明确说明
有以下几点:
cc
#include "tpl.h"
b.cc
#include "tpl.h"
tpl.h(取自显式专业化):
#ifndef TPL_H
#define TPL_H
template<class T> void f(T) {}
template<class T> inline T g(T) {}
template<> inline void f<>(int) {} // OK: inline
template<> int g<>(int) {} // error: not inline
#endif
编译这个,等等:
g++ a.cc b.cc
/tmp/ccfWLeDX.o: In function `int g<int>(int)':
inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
/tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status
在进行显式实例化时没有说明inline
也可能导致问题。
总而言之:对于非完全专业化的功能模板,即至少带有一种未知类型的功能模板,您可以省略inline
,并且不会收到错误,但它们仍然不是inline
。对于完全专业化,即仅使用已知类型的专业化,您不能省略它。
建议的经验法则:inline
如果你是认真的就写,并且保持一致。它让你更少考虑是否仅仅因为你可以。(这个经验法则符合Vandevoorde/Josuttis 的C++ 模板:完整指南)。