在模板中使用内联关键字是否有意义?

由于模板是在头文件中定义的,编译器能够确定内联函数是否有利,它是否有意义? 我听说现代编译器知道何时内联函数并忽略inline提示。


编辑:我想接受这两个答案,但这是不可能的。 为了解决这个问题,我接受了phresnel的答案,因为它得到了大部分的选票,他是正式的,但正如我在评论中提到的,我认为PuppyComponent 10的答案也是正确的,从不同的angular度。

问题在于C ++语义,在内inline关键字和内联的情况下不严格。 phresnel说:“如果你的意思是内联写的”,但是实际上inline意思并不清楚,因为它从原来的意义演变为一个指令,就像Puppy所说的那样,“停止了编译器对ODR违规的唠叨”。

这不是无关紧要的。 不,并不是每个函数模板默认都是inline的。 该标准甚至在显式专业化 ([temp.expl.spec])中明确

有以下几点:

a.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也可能导致问题。

所以总结 :对于非完全专用的函数模板,即至less携带一个未知types的模板,可以省略inline ,不接收错误,但仍然不是inline 。 对于完全的专业化,即只使用已知types的专业,你不能忽略它。

build议的经验法则 :如果你的意思是写inline ,只是一致的。 这让你更less思考是否或仅仅因为可以。 (这个经验法则符合Vandevoorde的/ Josuttis的C ++模板:完全指南 )。

这是无关的。 所有的模板已经inline – 更不用说,截至2012年, inline关键字的唯一用处就是停止编译器对ODR违规行为的嘲讽。 你是绝对正确的 – 你现在的编译器将知道自己的内联,甚至可以在翻译单元之间这样做。

正如你所build议的, inline是编译器的一个暗示,而不是其他。 它可以select忽略它,或者实际上,内联没有标记的函数。

使用inline模板曾经是一个(穷)的方式来解决问题,每个编译单元将为相同的模板类创build单独的对象,然后在链接时引起重复问题。 通过使用inline (我认为)名称mangling工作出不同的名称冲突链接时,但代价巨大的代码。

马歇尔·克莱因在这里解释它比我更好。