Смотрю описание шаблонов и заметил, что имена параметров везде помечены как необязательные, но ведь если имя отсутствует, то параметр внутри функции я использовать не смогу. Получается, что я могу объявить и вызвать такую функцию (https://ideone.com/VVicO8):
template <int> void f() {}
Но все версии этой функции будут одинаковы между собой - тогда зачем мне вообще параметр шаблона? Есть ли реальная пользя от возможности не указывать имя и создавать нечто подобное? Зачем вообще эта возможность заложена в стандарт?
Тема неиспользуемых аргументов в шаблонах классов уже поднималась: шаблонный класс, не использующий аргумент шаблона
В вашем конкретном примере - шаблон функции - использование фиктивного неименованного параметра может служить какой-то специальной внутренней более-менее экзотической технической цели.
Например, вам по какой-то причине необходимо иметь возможность генерировать копии одной и той же функции (т.е. делающие одно и то же), но при этом обладающие разной "адресной идентичностью", т.е. имеющие разные адреса
assert(&f<1> != &f<2>);
Не понимаю, почему вы решили, что все версии функции будут одинаковы. Отсутствие имени всего лишь означает, что параметр не используется, но это вовсе не значит, что f<7> это та же самая функция, что и f<5>, например. В частности можно сделать специализацию, которая будет делать что-то особенное, исходя из значения шаблонного аргумента:
#include <iostream>
template <int>
void f() {}
template <>
void f<7>() {
std::cout << "seven\n";
}
int main()
{
f<7>();
return 0;
}
Немного перефразирую вопрос: Имеется ли смысл иметь в шаблоне параметр, который в этом шаблоне затем никак не используется? (Потому что опускать имя - это потеря семантики.)
Для этого есть масса сценариев:
template <typename x_Tag, typename x_Type> class t_StrongTypedef (x_Tag никак не используется, код от x_Tag не зависит, параметр задается пользователем)int x_group_size 2/4/8. (x_group_size никак не используется, но код от x_group_size зависит, параметр задается пользователем)typename x_Enabled = ::std::enable_if_t< (x_Enabled никак не используется (и как раз часто опускается), код от x_Enabled не зависит, параметр может принимать только значение void и никогда не задается пользователем)typename x_Unused = void. (x_Unused никак не используется, код от x_Unused не зависит, параметр может принимать только значение void и никогда не задается пользователем)Сборка персонального компьютера от Artline: умный выбор для современных пользователей