doc*_*doc 110 c++ templates inline
由于模板是在头文件中定义的,编译器能够确定内联函数是否有利,它是否有意义?我听说现代编译器更好地知道何时内联函数并忽略inline提示.
编辑:我想接受这两个答案,但这是不可能的.为了解决这个问题,我接受了菲涅耳的回答,因为它收到了大多数选票并且他是正式的,但正如我在评论中所提到的,我从不同的角度考虑Puppy和组件10的答案也是正确的. .
问题出在C++语义中,在inline关键字和内联的情况下并不严格.Phresnel说"如果你的意思是写内联",但实际意义inline并不明确,因为它从原来的意义演变为"阻止编译人员讨论ODR违规"的指令,正如Puppy所说.
Seb*_*ach 93
这不是无关紧要的.不,不是每个功能模板都是inline默认的.该标准在显式专业化([temp.expl.spec])中甚至是明确的
有以下内容:
a.cc
#include "tpl.h"
Run Code Online (Sandbox Code Playgroud)
b.cc
#include "tpl.h"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
编译这个,等等:
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
Run Code Online (Sandbox Code Playgroud)
inline在进行显式实例化时不说明也可能导致问题.
总而言之:对于非完全专业化的功能模板,即带有至少一种未知类型的功能模板,您可以省略inline,而不是接收错误,但实际上它们不是inline.对于完全专业化,即仅使用已知类型的专业化,您不能省略它.
建议的经验法则:inline如果你的意思是写,只是保持一致.它会让你更少考虑是否因为你可以.(这个经验法则符合Vandevoorde的/ Josuttis的C++模板:完整指南).
Pup*_*ppy 29
这是无关紧要的.所有模板都已经inline- 更不用说从2012年开始,inline关键字的唯一用途就是阻止编译器对ODR违规行为提出质疑.你是绝对正确的 - 你当前的编译器将知道它自己内嵌的内容,甚至可以在翻译单元之间这样做.
| 归档时间: |
|
| 查看次数: |
56419 次 |
| 最近记录: |