Czym dokładnie jest „kontekst bezpośredni” wymieniony w standardzie C ++ 11, do którego ma zastosowanie SFINAE?

Paragraf 14.8.2 / 8 Standardu C ++ 11 określa warunki, w których niepowodzenie zastąpienia spowoduje lub nie spowoduje „twardego” błędu kompilacji (powodując tym samym niepowodzenie kompilacji) lub „miękkiego” błędu, który tylko powodują, że kompilator odrzuca szablon z zestawu kandydatów na rozdzielczość przeciążenia (bez niepowodzenia kompilacji i włączenia dobrze znanego idiomu SFINAE):

Jeśli podstawienie skutkuje nieprawidłowym typem lub wyrażeniem, odliczenie typu nie powiedzie się. Niepoprawny typ lub wyrażenie to taki, który byłby źle sformatowany, gdyby został napisany przy użyciu podstawionych argumentów. [Uwaga: Sprawdzanie dostępu odbywa się w ramach procesu podstawiania. —End Uwaga]Tylko niepoprawne typy i wyrażenia w bezpośrednim kontekście typu funkcji i jej typów parametrów szablonu mogą spowodować niepowodzenie odliczenia. [...]

Słowa "natychmiastowy kontekst„pojawia się tylko 8 razy w całym standardzie C ++ 11 i za każdym razem następuje (lub występuje jako) instancja następującego (nienormatywnego) tekstu:

[Uwaga:Ocena podstawionych typów i wyrażeń może skutkować efektami ubocznymi, takimi jak tworzenie instancji specjalizacji szablonów klas i / lub specjalizacji szablonów funkcji, generowanie niejawnie zdefiniowanych funkcji itp. Takie efekty uboczne nie są w „bezpośrednim kontekście” i może spowodować, że program zostanie źle sformatowany.—End Uwaga]

Notatka podaje (niezbyt hojną) wskazówkę, co to znaczynatychmiastowy kontekst, ale przynajmniej dla mnie to często nie wystarcza, aby zdecydować, czy zastąpienie ma lub nie powinno spowodować „twardego” błędu kompilacji.

PYTANIE:

Czy mógłbyś przedstawić wyjaśnienie, procedurę decyzyjną i / lub konkretne przykłady, które pomogą ustalić, w jakich przypadkach błąd substytucji występuje i nie występuje w „natychmiastowy kontekst„typu funkcji i jej typów parametrów szablonu?

questionAnswers(2)

yourAnswerToTheQuestion