仅在具有零参数模板的头文件中定义c ++全局函数?

时间:2017-11-23 01:45:08

标签: c++ function c++11 templates global

这是this SO questionone 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.cpptest.cpp的副本,其中main()函数已重命名为其他内容)

我的问题是:

  1. 上述技术是否可以安全地使用模板进行ODR和编译? (换句话说,是否存在上述技术失败的情况?)

  2. 如果是这样,是否可以重写模板并删除虚拟模板变量Ttypename T = void)以使其更短(即零参数)而且噪音较少?

1 个答案:

答案 0 :(得分:3)

  
    

inline只是对编译器的一个提示,它有时可能不内联

  

虽然链接器处理内联 1 代码是正确的,但inline关键字对于出现非模板化自由函数定义是必需的在头文件中,以防止在链接阶段出现多个定义错误。

换句话说:
如果在链接阶段inline看到匹配的内联 1 定义函数,则允许识别其来源并决定将其替换为链接器(实际上是内联 1 )。

1) 内联 在该上下文中意味着一些简单的陈述,例如只需要一些简单的CPU寄存器操作,就可以用这些操作代替,而不是发出一个完整的函数调用帧。