Поиск…


замечания

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

Что такое допустимая перегрузка шаблона функции?

Шаблон функции может быть перегружен по правилам для перегрузки без шаблонов (одно имя, но разные типы параметров), и в дополнение к этому перегрузка действительна, если

  • Тип возврата отличается, или
  • Список параметров шаблона отличается, за исключением названий параметров и наличия аргументов по умолчанию (они не являются частью подписи)

Для нормальной функции сравнение двух типов параметров легко для компилятора, так как оно имеет всю информацию. Но тип внутри шаблона еще не определен. Таким образом, правило, когда два типа параметров равны, здесь аппроксимативно и говорит, что типы и значения, не относящиеся к депеппенденду, должны совпадать, а написание зависимых типов и выражений должно быть одинаковым (точнее, они должны соответствовать так называемые ODR-правила), за исключением того, что параметры шаблона могут быть переименованы. Однако, если при таких разных написаниях два значения внутри типов считаются разными, но всегда будут создавать экземпляры с одинаковыми значениями, перегрузка недействительна, но никакой диагностики не требуется от компилятора.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

Это допустимая перегрузка, так как «T» и «T *» - это разные варианты написания. Но следующее недопустимо, без необходимости диагностики

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow