Ответ 1
[ПРИМЕЧАНИЕ: это изначально не предназначалось для ответа на вопрос, но я обнаружил решение при разработке вопроса]
Есть ли какая-либо гарантия на порядок, в котором будет выполняться замена для параметров функции и возвращаемых типов?
Не в текущем стандарте.
Однако этот отчет о дефектах (любезно предоставлен Xeo) показывает, что это действительно так. Вот предлагаемая новая формулировка для пункта 14.8.2/7 Стандарта С++ 11 (который стал частью n3485 draft)
Подстановка происходит во всех типах и выражениях, которые используются в типе функции и в шаблоне объявления параметров. Выражения включают не только постоянные выражения, такие как те, которые появляются в массива или как аргументы шаблона nontype, но и общие выражения (т.е. непостоянные выражения) внутри sizeof, decltype и другие контексты, которые допускают неконстантные выражения. Замена продолжается в лексическом порядке и останавливается, когда встречается условие, которое вызывает дедукцию,. [...]
Как правильно указано Nicol Bolas в комментариях к вопросу, лексический порядок означает, что возвращаемый тип возврата будет заменен после типов параметров, как показано в этот живой пример.