SFINAE Substitution Failure Is Not An Error
La règle C++ selon laquelle un template devenu invalide une fois les types substitués est discrètement écarté de l'ensemble des candidats au lieu d'interrompre la compilation.
La règle existait à l'origine pour que la résolution de surcharge se comporte de façon sensée, mais on a vite découvert qu'elle servait d'outil d'interrogation : on écrit un template qui ne peut être instancié que si un type possède telle propriété, et le compilateur retient la seule surcharge qui survit. De là sont nés std::enable_if, toute la bibliothèque de type traits, et une génération de code qui décidait à la compilation si un type avait une méthode begin().
Cela fonctionnait, mais l'idiome était obscur, et une seule erreur produisait des écrans de messages expliquant pourquoi aucun candidat ne convenait. C++20 a de fait remplacé toute la technique par les concepts et requires, qui disent la même chose sans détour.