Qu'est-ce que “l'Expression SFINAE”?
À http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx, le VC++ équipe de déclarer officiellement qu'ils n'ont pas encore mis en œuvre le C++11 de base de la fonction "Expression SFINAE". Cependant, Les exemples de code suivants copié à partir de http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html sont acceptées par le compilateur VC++.
exemple 1:
template <int I> struct A {};
char xxx(int);
char xxx(float);
template <class T> A<sizeof(xxx((T)0))> f(T){}
int main()
{
f(1);
}
exemple 2:
struct X {};
struct Y
{
Y(X){}
};
template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); //#1
X f(Y, Y); //#2
X x1, x2;
X x3 = f(x1, x2); //deduction fails on #1 (cannot add X+X), calls #2
Ma question est: qu'est-Ce que "l'Expression SFINAE"?
- Pourquoi ne pas regarder dans la évident: en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
- Qui explique normal SFINAE, pas l'Expression SFINAE. C'est un bon point, cependant. Ne OP savoir sur SFINAE en général?
- Oui, je sais SFINAE en général. Un grand merci à vous pour votre illustration explication.
Vous devez vous connecter pour publier un commentaire.
Expression SFINAE s'explique assez bien dans le papier que vous lié, je pense. C'est SFINAE sur des expressions. Si l'expression à l'intérieur de
decltype
n'est pas valide, bien, coup de pied la fonction de la salle VIP de surcharges. Vous pouvez trouver le normatif libellé à la fin de cette réponse.Une note sur VC++: Ils n'ont pas la mettre en œuvre complètement. Sur des expressions simples, il pourrait fonctionner, mais sur d'autres, il ne sera pas. Voir une discussion dans les commentaires sur cette réponse pour les exemples qui échouent. Pour faire simple, cela ne fonctionne pas:
Avec Clang, ce extrants attendus:
Avec MSVC, je reçois... eh bien, une erreur de compilateur:
Il semble également que GCC 4.7.1 n'est pas tout à fait à la hauteur:
Un usage courant de l'Expression SFINAE est lors de la définition des traits, comme un trait de vérifier si une classe de sport une certaine fonction de membre:
Exemple vivant. (Qui, de façon surprenante, fonctionne à nouveau sur GCC 4.7.1.)
Voir aussi cette réponse de la mine, qui utilise la même technique dans un autre environnement (aka sans traits).
Normatif libellé:
§14.8.2 [temp.deduct]