这是this SO question和one of the answers的后续问题。
我有时想在.h
文件中以标题方式定义一个函数,例如:
int id(int i) { return i; }
我知道可以使用inline
函数完成此操作。正如我从评论中读到的那样
inline只是对编译器的一个提示,它有时可能不内联
根据上面的链接答案,似乎也可以
使其成为模板功能
通过例如在标题test.h
中使用虚拟类型变量,如下所示:
template <typename T = void>
int id(int i) { return i; }
然后使用g++ -std=c++17 test.cpp test2.cpp
#include "test.h"
int main() { return id(1); }
(test2.cpp
是test.cpp
的副本,其中main()
函数已重命名为其他内容)
我的问题是:
上述技术是否可以安全地使用模板进行ODR和编译? (换句话说,是否存在上述技术失败的情况?)
如果是这样,是否可以重写模板并删除虚拟模板变量T
(typename T = void
)以使其更短(即零参数)而且噪音较少?
答案 0 :(得分:3)
inline只是对编译器的一个提示,它有时可能不内联
虽然链接器处理内联 1 代码是正确的,但inline
关键字对于出现非模板化自由函数定义是必需的在头文件中,以防止在链接阶段出现多个定义错误。
换句话说:
如果在链接阶段inline
看到匹配的内联 1 定义函数,则允许识别其来源并决定将其替换为链接器(实际上是内联 1 )。
1) 内联 在该上下文中意味着一些简单的陈述,例如只需要一些简单的CPU寄存器操作,就可以用这些操作代替,而不是发出一个完整的函数调用帧。