Что именно означает «непосредственный контекст», упомянутый в стандарте C ++ 11, для которого применяется SFINAE?

Пункт 14.8.2 / 8 Стандарта C ++ 11 определяет условия, при которых сбой замещения должен приводить или не должен приводить к «жесткой» ошибке компиляции (что приводит к сбою компиляции) или к «мягкой» ошибке, которая просто заставить компилятор отказаться от шаблона из набора кандидатов для разрешения перегрузки (без сбоя компиляции и включения хорошо известной идиомы SFINAE):

Если подстановка приводит к недопустимому типу или выражению, вывод типа завершается неудачей. Недопустимый тип или выражение - это то, что было бы неправильно сформировано, если было бы написано с использованием замещенных аргументов. [Примечание: проверка доступа выполняется как часть процесса замены. —Конечная записка]Только недопустимые типы и выражения в непосредственном контексте типа функции и ее типов параметров шаблона могут привести к ошибке вывода, [...]

Слова "непосредственный контекстmsgstr "появляются только 8 раз во всем стандарте C ++ 11, и каждый раз, когда они сопровождаются (или встречаются как часть) экземпляром следующего (ненормативного) текста:

[Запись:Оценка замещенных типов и выражений может привести к побочным эффектам, таким как создание специализаций шаблонов классов и / или специализаций шаблонов функций, генерация неявно определенных функций и т. Д. Такие побочные эффекты не находятся в «непосредственном контексте» и может привести к некорректной работе программы.—Конечная записка]

Записка дает (не очень щедрый) намек на то, что подразумевается поднепосредственный контекст, но по крайней мере для меня этого часто недостаточно, чтобы решить, является ли подстановка «жесткой» ошибкой компиляции.

ВОПРОС:

Не могли бы вы предоставить объяснение, процедуру принятия решения и / или некоторые конкретные примеры, чтобы помочь выяснить, в каких случаях ошибка замещения возникает и не возникает в "непосредственный контекст"типа функции и его параметров шаблона?

Ответы на вопрос(2)

Ваш ответ на вопрос