Специализация шаблона функции определяет эффект вызова, когда сам шаблон выбирается с помощью разрешения перегрузки (в котором используется сигнатура, но не определение специализации).Это верно независимо от того, генерируется ли специализация неявно или явно.
Отдельная функция участвует в разрешении перегрузки сама по себе, конкурируя с шаблоном функции с небольшим преимуществом, которое может быть легко компенсировановывод аргумента шаблона (хотя и не здесь, так как ваш T
не может быть выведен).Его можно полностью исключить с помощью явного списка аргументов шаблона (даже пустого, если все аргументы шаблона могут быть выведены), что означает, что шаблону все равно должно быть дано разумное определение для всех типов (даже если некоторыеудаляются или иным образом не компилируются).
Что касается inline
, проблемы не отличаются от проблем для любой функции: предоставление определения в заголовке может быть важным для оптимизации, разрешить библиотеку только для заголовкауменьшить текстовое повторение, или просто создать более тесную связь, которая затруднит изменение кода.Поскольку определение первичного шаблона обычно должно быть в заголовке, возможно, имеется и уклон в сторону определения определения специализации.Как всегда, знание заявления и суждения требуется.