Перегрузка шаблона по типу возврата
Mooing Duck делает комментарий здесь: "Одна функция не может возвращать несколько типов. Однако, вы можете специализироваться или делегировать на перегрузки, что отлично работает".
Я начал об этом думать, и я пытаюсь выяснить, как этот юридический код:
template <typename T>
T initialize(){ return T(13); }
При вызове с помощью:
auto foo = initialize<int>();
auto bar = initialize<float>();
Не переводит ли это 2 функции с одним и тем же именем, перегруженные только с помощью возвращаемого типа?
Ответы
Ответ 1
Это не перегрузка, это специализация. Это разные механизмы (на самом деле их смешивание может привести к путанице, потому что перегрузки разрешаются до того, как будут рассмотрены специализации - см. Статью "Sutter Mill", например: http://www.gotw.ca/publications/mill17.htm).
Ответ 2
Здесь приведен пример недопустимого значения возвращаемого значения:
int initialize();
float initialize();
OTOH, учитывая первичное определение шаблона
template <typename T>
T initialize(){ return T(13);}
Цитата из здесь
Чтобы скомпилировать вызов функции, компилятор должен сначала выполнить поиск имени, который для функций может включать зависящий от аргументов поиск, а для шаблонов функций может следовать вычет аргумента шаблона. Если эти шаги производят более одной кандидатской функции, то выполняется перегрузка разрешения для выбора функции, которая будет фактически вызвана.
initialize<int>
и initialize<float>
- это просто два разных экземпляра указанного шаблона. Они являются двумя различными функциями и не будут частью одного и того же списка потенциальных кандидатов на разрешение перегрузки.