Рассмотрим этот шаблон функции:
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
После вывода типа T
из типа первого аргумента в вызове foo()
компилятор перейдет к замене T
и создаст экземпляр функции.
Если подстановка для возвращаемого типа выполняется сначала, в результате чего происходит простой сбой подстановки, компилятор отбрасывает этот шаблон функции при вычислении набора перегрузки и поиске других жизнеспособных перегрузок (SFINAE).
С другой стороны, если сначала возникает подстановка второго параметра функции, что приводит к жесткой ошибке (например, из-за отказа подстановки в небедренном контексте), вся компиляция завершится неудачно.
ВОПРОС: Есть ли какая-либо гарантия в том порядке, в котором будет выполняться подстановка для параметров функции и возвращаемых типов?
ПРИМЕЧАНИЕ. Этот пример показывает, что на всех основных компиляторах (VC11 был протестирован отдельно и дал одинаковые результаты) замена для возврата тип возникает перед подстановкой для типов параметров.