Перегрузка шаблона по типу возврата

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> - это просто два разных экземпляра указанного шаблона. Они являются двумя различными функциями и не будут частью одного и того же списка потенциальных кандидатов на разрешение перегрузки.