inline和template <class>之间的实际区别是什么?

时间:2018-11-15 09:07:41

标签: c++

我们有2种方法在仅标头库中声明函数。它们是inlinetemplate<class = void>。在boost source code中,我可以看到两个变体。示例如下:

inline void my_header_only_function(void)
{
   // Do something...
   return;
}

template<class = void> void my_header_only_function(void)
{
   // Do something...
   return;
}

我知道根据C ++标准有什么区别。但是,任何C ++编译器都不仅仅是标准编译器,而且标准不清楚。

在从不使用模板参数且与递归可变参数模板不相关的情况下,主流编译器的两个变体之间是否存在(并且是什么)实用差异?

3 个答案:

答案 0 :(得分:9)

我认为通过为void或同一命名空间中函数的非模板版本提供专门化,这可以用作允许从外部库代码进行库扩展(或模拟)的怪异方法:

#include <iostream>

template<class = void>
int
foo(int data)
{
    ::std::cout << "template" << std::endl;
    return data;
}
// somewhere else
int
foo(int data)
{
    ::std::cout << "non-template" << std::endl;
    return data;
}

int main()
{
    foo(1); // non template overload is selected
    return 0;
}

online compiler

答案 1 :(得分:8)

一个区别是,即使该函数从未在该文件中使用过,该函数的二进制代码也可能会成为生成的目标文件的一部分,但是如果模板是不使用。

答案 2 :(得分:2)

我是《野兽》的作者。希望我能阐明为什么你看到一个相对于另一个。这确实非常简单,该模板似乎不太可能内联到调用函数中,从而不必要地膨胀了代码。我知道,“内联”实际上仅应表示“删除重复定义”,但有时编译器实现者会过分热衷。模板的内容在编译时会有点困难(Travis有时仅在2GB RAM时会掉线)。因此,我决定尝试使用“ inline”关键字编写一些新内容。我仍然不知道我的感受。

简短的回答是,我很长时间以来一直在以一种方式进行此操作,然后我又以另一种方式进行了简短的解释,而没有特别强烈的理由。抱歉,如果没有其他理论那么令人兴奋的话! (实际上非​​常有趣)

相关问题