В чем практическая разница между "встроенными" и "шаблонными <class= void>"?

У нас есть 2 метода для объявления функции в библиотеке только для заголовка. Они inline и template<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;
}

Я знаю разницу в соответствии со стандартом C++. Тем не менее, любой C++ компилятор намного больше, чем просто стандартный, а также стандартный, часто неясный.

В ситуации, когда аргумент шаблона никогда не используется и где он не связан с рекурсивным вариационным шаблоном, есть (и какова) практическая разница между двумя вариантами для основных компиляторов?

Ответ 1

Я думаю, что это можно использовать как странный способ разрешить расширение библиотеки (или насмешку) извне кода библиотеки, предоставляя специализацию для 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;
}

онлайн компилятор

Ответ 2

Одно из отличий состоит в том, что двоичный код функции может стать частью сгенерированного объектного файла, даже если функция никогда не используется в этом файле, но никогда не будет никакого кода для шаблона, если он не используется.

Ответ 3

Я автор Зверя. Надеюсь, я смогу пролить свет на то, почему вы видите одно против другого. Это на самом деле очень просто, кажется, что шаблон, скорее всего, не будет встроен в вызывающие функции, без необходимости раздувая код. Я знаю, что "inline" на самом деле должен означать "удалить дубликаты определений", но иногда разработчики компиляторов становятся слишком усердными. С шаблоном все немного сложнее (Трэвис иногда выдает только 2 ГБ ОЗУ). Поэтому я решил попробовать написать что-то новое, используя ключевое слово "inline". Я до сих пор не знаю, что я чувствую по этому поводу.

Короткий ответ: я делал это одним способом в течение долгого времени, а затем я кратко сделал это другим способом без особой веской причины. Извините, если это не так интересно, как другие теории! (которые были очень интересны на самом деле)