O que exatamente é o “contexto imediato” mencionado no Padrão C ++ 11 para o qual a SFINAE se aplica?

O parágrafo 14.8.2 / 8 da norma C ++ 11 especifica as condições sob as quais uma falha de substituição deve ou não resultar em um erro de compilação "difícil" (fazendo com que a compilação falhe) ou em um erro "soft" que apenas faça com que o compilador descarte um modelo de um conjunto de candidatos para a resolução de sobrecarga (sem fazer a compilação falhar e ativar o conhecido idioma SFINAE):

Se uma substituição resultar em um tipo ou expressão inválido, digite dedução. Um tipo ou expressão inválida é aquela que seria malformada se escrita usando os argumentos substituídos. [Nota: A verificação de acesso é feita como parte do processo de substituição. - end note]Somente tipos e expressões inválidos no contexto imediato do tipo de função e seus tipos de parâmetro de modelo podem resultar em uma falha de dedução. [...]

As palavras "contexto imediato"aparecem apenas 8 vezes em todo o C ++ 11 Standard, e cada vez que eles são seguidos por (ou ocorrem como parte de) uma instância do seguinte texto (não normativo):

[Nota:A avaliação dos tipos e expressões substituídos pode resultar em efeitos colaterais como a instanciação de especializações de modelos de classes e / ou especializações de modelos de funções, a geração de funções definidas implicitamente, etc. Tais efeitos colaterais não estão no “contexto imediato” e pode resultar no programa ser mal formado.- end note]

A nota dá uma sugestão (não muito generosa) sobre o que se entende porcontexto imediatomas, pelo menos para mim, isso geralmente não é suficiente para decidir se uma substituição é ou não deve causar um erro de compilação "difícil".

QUESTÃO:

Você poderia fornecer uma explicação, um procedimento de decisão e / ou alguns exemplos concretos para ajudar a descobrir em quais casos um erro de substituição ocorre e não ocorre em "contexto imediato"do tipo de função e seus tipos de parâmetro de modelo?

questionAnswers(2)

yourAnswerToTheQuestion