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