`inline`和`template <class = void>`有什么实际区别?

Vit*_*lii 23 c++

我们有2种方法在仅头文件库中声明函数.他们是inlinetemplate<class = void>.在boost源代码中,我可以看到两种变体.示例如下:

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

template<class = void> void my_header_only_function(void)
{
   // Do something...
   return;
}
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*670 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;
}
Run Code Online (Sandbox Code Playgroud)

在线编译器

  • 看起来你是对的,我没想到.肯定是实际差异,我们可以使用内联或非内联函数覆盖模板. (2认同)

Rei*_*ica 8

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